zoukankan      html  css  js  c++  java
  • Command Operating System by cdsidi(ComSys) 0.2.x版本陆续更新

      1 /*每个类依赖功能的类:
      2     comsolve_com:几乎所有
      3     err_com: syscore_com systemio_com out_com
      4     in_com:无
      5     out_com:无
      6     storage_com:懒得写了
      7     strext_com:无
      8     syscore_com:
      9         systemio_com
     10         out_com
     11         storage_com
     12         comsolve_com
     13         in_com
     14         strext_com
     15     systemio_com: 无
     16     welcome_com: out_com
     17 */
     18 /************更新日志*************************** 
     19 0.0.1:    基本的框架和命令基础 
     20 0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备
     21 0.1.0: 在底层支持了Integer类型 
     22 0.1.1: 优化了用户交互、完善了代码注释 
     23 0.1.2: 添加了广告
     24 0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 
     25 0.1.4:    1.添加了"cls"指令 用于清屏 
     26         2. storage 已经支持Integer/Floating/String全类型 
     27         3. 现在命令首尾如果有空格会自动忽略(trim函数) 
     28         4.支持通过varinfo string 来输出变量的内容 
     29 0.1.4 patch 1: 1.修复了bug;添加了 cls 指令在help内 
     30 0.1.5:    1.添加了syscore_com 类 拆分了welcome_com的一些功能
     31          2.整合了开始屏幕和关闭屏幕欢迎信息
     32         3.添加了"welcome::about()"包含系统信息和广告 
     33         4.更改了版本号系统[x.x.x.x] 最后一位是补丁号 
     34 0.2.0:    TestEdition 1:
     35         1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度 
     36         2.现在版本号已经包含在welcome_com中
     37         3.已经在comsolve_com里添加了中文命令的定义 
     38         Test Edition 2:
     39         4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
     40         5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖) 
     41         6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition] 
     42         7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
     43         8.重磅更新:comsolve_com::varsole(string s)已经可用
     44             用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它” 
     45         9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
     46         10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色 
     47         11.优化了多语言 
     48         patch 0:
     49         12.为正式版优化GUI  
     50         13.添加了runtime 命令 获取系统从开始到当前时刻的时间 
     51         14.补全了测试版的一些命令相关(中文,help)
     52         patch 1:
     53         1.完善了注释
     54         2.sysinfo 修复bug:系统启动时间显示没有冒号
     55         3.新功能:现在程序标题栏会显示ComSys
     56         4.systemio_com::重写了sleep(int),添加了sleep_until(int),
     57         5.令syscore_com::startsys改用sleep_until 加快启动时间
     58         6.对storage_com 的整理 
     59 ***********************************************/ 
     60 #include<iostream>
     61 #include<string>
     62 #include<cstdlib> 
     63 #include<vector>
     64 #include<map>
     65 #include<ctime>
     66 #include<cstdio>
     67 #include<sstream>
     68 using std::cin;
     69 using std::cout;
     70 using std::string;
     71 using std::endl;
     72 using std::vector;
     73 using std::map;
     74 class strext_com{//字符串处理扩展功能 
     75     public:
     76         static void trim(string &s){//删除字符串首尾空格 
     77             if(s.empty()) return;
     78             s.erase(0,s.find_first_not_of(' '));
     79                 s.erase(s.find_last_not_of(' ') + 1);
     80         }
     81         static bool is_empty_char(char c){
     82             return c==' '|| c=='
    ';
     83         }
     84 };
     85 class out_com{//字符串输出 
     86     public:
     87         static void print(string s);//输出 
     88         static void print(string s,int from);//从第from开始输出,一直到最后 
     89         static void println(string s);//输出并换行 
     90         static void println(string s,int from);//从from开始输出,并换行     
     91 };
     92 class err_com{//错误处理 
     93     public:
     94     static void throwln(string s);//输出错误信息 
     95     static void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 
     96 };
     97 class fileio_com{//文件输入输出(还没写)
     98 };
     99 class in_com{//字符串输入 
    100     public:
    101         static void read(string &s);//输入(空白作结尾符号) 
    102         static void readln(string &s); //输入(换行作结尾符号) 
    103 };
    104 class systemio_com{ //依赖于Windows io的功能 
    105     public:                 
    106     static void windowscmd(string s){//直接在cmd里面执行指令 
    107         system(s.c_str());
    108     }
    109     static progexit(int code){//退出程序并且错误码为code 
    110         exit(code);
    111     }
    112     static void cleanscr();//清屏 
    113     static sleep_until(int k){ //暂停到k毫秒 
    114         while(gettime()<=k);
    115     }
    116     static sleep(int k){//暂停k毫秒
    117         sleep_until(gettime()+k);
    118     }
    119     static void changeclr(string s){
    120         string tmp="color "+s;
    121         system(tmp.c_str());
    122     }
    123     static int gettime(){ //获取程序运行的时间 
    124         return clock();
    125     }
    126 };
    127 class welcome_com{//系统欢迎与用户界面(并不是系统核心) 
    128     public:
    129         static const int vernum1=0,vernum2=2,vernum3=0,verpatch=1;
    130         static int sysstarttime;//系统启动的时间 
    131         static void sysinfo();//系统信息 
    132         static void help();//输出帮助信息
    133         static void advertisements();//输出广告 
    134         static void about();//输出关于信息 
    135 };
    136 int welcome_com::sysstarttime=-1; 
    137 class storage_com{//存储管理 
    138     public:
    139         static const int code_void=0,//空类型 
    140                         code_integer=1,//整数 
    141                         code_floating=2,//浮点数 
    142                         code_string=3;//字符串
    143         struct varinfo{//保存变量信息的数据结构 
    144             string name;
    145             int type;
    146             int address;
    147             varinfo(int a=0,int b=0):type(a),address(b){}
    148             varinfo(string a,int b,int c):name(a),type(b),address(c){}
    149         };
    150         typedef int type_t;//存储类型的类型 
    151         typedef long long Integer;//Integer:long long
    152         typedef double Floating;//Floating: double
    153         typedef string String;//String: string
    154         static vector<Integer> Ints;//保存Integer 的数组 
    155         static vector<Floating> Floats;//保存Floating的数组 
    156         static vector<String> Strings;//保存String的数组 
    157         static map<string,varinfo> varmap;//string->varinfo的映射 
    158         static map<string,type_t> typemap;//string->type的映射 
    159         static const string
    160             code_str_void,
    161             code_str_integer,
    162             code_str_floating,
    163             code_str_string;
    164         static const string
    165             code_err_wrongtype;
    166     public:
    167         storage(){}
    168         static void init();
    169         static int gettype(string name);//获得变量名name的类型 
    170         static void putvalue(string name,long long val);//将变量名name的值设为val
    171         static void putvalue(string name,int val); 
    172         static void putvalue(string name,string val);
    173         static void putvalue(string name,double val);
    174         static int getInteger(string name);//获得name的int值 
    175         static String getString(string name);
    176         static double getFloating(string name);
    177         static string getvarstr(varinfo var);
    178         static string getvarstr(string name);
    179         static void printvarstr(string name);
    180         static void printvarstrln(string name);
    181         static void solve0(string command);
    182 
    183 };
    184 const string storage_com::code_str_void="VOID",
    185             storage_com::code_str_integer="INTEGER",
    186             storage_com::code_str_floating="FLOATING",
    187             storage_com::code_str_string="STRING",
    188             storage_com::code_err_wrongtype="Wrong Type";
    189 vector<storage_com::Integer> storage_com::Ints;//保存Integer 的数组 
    190 vector<storage_com::Floating> storage_com::Floats;//保存Floating的数组 
    191 vector<storage_com::String> storage_com::Strings;//保存String的数组 
    192 map<string,storage_com::varinfo> storage_com::varmap;//string->varinfo的映射 
    193 map<string,storage_com::type_t> storage_com::typemap;
    194 class syscore_com{//系统核心
    195     public:
    196         static const int cnt_stars=80,cnt_emptyl=8,waitms=3000;
    197         static const string version;//版本号提示
    198         static void closesys();//关闭系统 
    199         static void startsys();//启动和初始化 
    200         static void initsys();//延迟初始化 
    201         static void closetimeout(int m_secs);//延迟关闭(毫秒) 
    202         static void welcomescr(string message);//开始和关闭画面 
    203         static void sysmain();//系统运行的重要内容 
    204 };
    205 class comsolve_com{//指令处理 
    206     public:
    207         static const int Max_basic_command=100;//最大命令数目(现在只有8个) 
    208         static const int
    209             codecom_base_en=Max_basic_command*0,
    210             codecom_base_cn=Max_basic_command*1;        
    211         static const int 
    212             code_unknown=0,//错误指令 
    213             code_print=1,
    214             code_windowscmd=2,
    215             code_exit=3,
    216             code_sysinfo=4,
    217             code_help=5,
    218             code_var=6,
    219             code_cls=7,
    220             code_color=8,
    221             code_runtime=9;
    222         static const char 
    223             code_varflag0='%';//变量出现的标志 
    224         static string basic_command_cn[Max_basic_command];
    225         static string basic_command[Max_basic_command];//指令代号->指令名的映射 
    226         static map<string,int> commap;//指令名->指令代号的映射 
    227     private:
    228         //static void push_command(string s,int code,int codebase);
    229     public:
    230         static void init();//初始化 
    231         static void solve0(string s);//第一步处理
    232         static void solve1(string s,int left,int code_raw);//第二步命令处理 
    233         static string varsolve(string s);//把字符串中的变量替换成所代表的的值
    234 };
    235 string comsolve_com::basic_command[Max_basic_command];//指令代号->指令名的映射
    236 string comsolve_com::basic_command_cn[Max_basic_command]; 
    237 map<string,int> comsolve_com::commap;//指令名->指令代号的映射 
    238 class System_com{//基本功能(几乎无需初始化) 
    239     public:
    240         out_com out;
    241         err_com err;
    242         in_com in;
    243         systemio_com sysio;
    244         fileio_com fileio;
    245         welcome_com wel;
    246         syscore_com syscore;
    247     System_com(){}
    248 };
    249 class Systemext_com{//基本拓展功能(可能需要初始化) 
    250     public:
    251         storage_com var;
    252         comsolve_com comsolve;
    253     Systemext_com(){}
    254 }; 
    255 void out_com::print(string s){
    256     print(s,0);
    257 }
    258 void out_com::println(string s){
    259     println(s,0);
    260 }
    261 void out_com::print(string s,int from){
    262     int len=s.length();
    263     string s1=s.substr(from,len-from);
    264     cout<<s1;
    265 }
    266 void out_com::println(string s,int from){
    267     print(s,from);cout<<endl;
    268 }
    269 void in_com::read(string &s){
    270     cin>>s;
    271 }
    272 void in_com::readln(string &s){
    273     getline(cin,s);
    274 }
    275 void err_com::throwln(string s){
    276     systemio_com::windowscmd("color 1f"); //color 1 3 9是蓝色 
    277     out_com::println("System Error:There is a problem:");
    278     out_com::println(s);
    279 }
    280 void err_com::throwshut(string s,int timeout){
    281     throwln(s);
    282     syscore_com::closetimeout(timeout);
    283 } 
    284 void welcome_com::sysinfo(){
    285     std::stringstream versionstream,timestream;
    286     versionstream<<"[Version:"<<vernum1<<"."<<vernum2<<"."<<vernum3<<"."<<verpatch<<"]";
    287     timestream<<sysstarttime<<"(ms)]";
    288     if(verpatch<0) versionstream<<"[TestEdition]";
    289     string versionstring,timestring;
    290     versionstream>>versionstring;
    291     timestream>>timestring;
    292     timestring="[System start time:"+timestring;
    293     out_com::println("[Command Operatoring System]");
    294     out_com::println("[This system is designed by CDsidi.]");
    295     out_com::println(versionstring);
    296     if(sysstarttime!=-1){
    297         out_com::println(timestring);
    298     }
    299 }
    300 void welcome_com::advertisements(){
    301     if(verpatch<=-1){
    302         out_com::println("********Test Edition: No Advertisement*********");
    303         return;
    304     }
    305     out_com::println("****************以下是广告*************");
    306     out_com::println("_______广告 1_________ ");    
    307     out_com::println("如果喜欢ComSys,请捐助我 ");    
    308     out_com::println("如果想投放广告,请联系我 ");
    309     out_com::println("https://www.cnblogs.com/cdsidi");
    310     out_com::println("_______广告 2_________ ");    
    311     out_com::println("现在加入 51C SB 派对!");
    312     out_com::println("****************广告已结束*************");
    313 }
    314 void welcome_com::about(){
    315     sysinfo();
    316     advertisements();
    317 };
    318 //这里有bug 先不用了 
    319 string comsolve_com::varsolve(string s){//将%varname%替换为var的值 
    320     string ret=s;
    321     int len=s.length(),
    322         lastplace=-1;//上一个没有配对的varflag位置 
    323     for(int i=0;i<len;++i){
    324         if(s.at(i)==code_varflag0){
    325             if(lastplace==-1){
    326                 lastplace=i;
    327             }else{
    328                 string varname=s.substr(lastplace+1,i-(lastplace+1));//恰好截取varflag中间的部分 
    329                 if(!varname.empty()){
    330                     string varstr=storage_com::getvarstr(varname);
    331                     if(varstr==storage_com::code_str_void) continue; 
    332                     ret.erase(lastplace,i-lastplace+1);//删除ret从lastplace开始,一直到i的部分[lastplace,i]
    333                     ret.replace(lastplace,0,varstr);
    334                     lastplace=-1;
    335                     int tmp=varstr.length()-(varname.length()+2);//当前指针i的变化量
    336                     i+=tmp;
    337                     len+=tmp;
    338                 }else{
    339                     //lastplace=i; 
    340                 }
    341             }
    342         }
    343     }
    344     for(int i=1;i<len;++i){//将两个连续的'%'编程一个'%' 
    345         if(ret.at(i)==code_varflag0 && ret.at(i-1)==code_varflag0){
    346             ret.erase(i,1);
    347             i-=1;
    348             len-=1;
    349         }
    350     }
    351     return ret;
    352 }
    353 void comsolve_com::solve1(string s,int left,int code_raw){
    354     int base=code_raw/Max_basic_command,//语言基值 
    355         code=code_raw%Max_basic_command;//命令名 
    356     int len=s.length();
    357     string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 
    358     switch(code){
    359         case code_unknown:
    360             out_com::println("Bad command.
    Please type 'help' for help of commands.");break;
    361         case code_print:
    362             out_com::println(tmp);break;
    363         case code_windowscmd:
    364             systemio_com::windowscmd(tmp);break;
    365         case code_exit:
    366             syscore_com::closesys();break;
    367         case code_sysinfo:
    368             welcome_com::sysinfo();break;
    369         case code_help:
    370             welcome_com::help();break;
    371         case code_var:
    372             storage_com::solve0(tmp);break;
    373         case code_cls:
    374             systemio_com::cleanscr();break;
    375         case code_color:
    376             systemio_com::changeclr(tmp);break;
    377         case code_runtime:
    378             cout<<systemio_com::gettime()<<"(ms)"<<endl;break;
    379         default:
    380             err_com::throwln("Bad Command!");
    381     }
    382 }
    383 void comsolve_com::solve0(string s){
    384     int len=s.length();
    385     for(int i=0;i<len;++i){//枚举第一级命令的结尾
    386         if(strext_com::is_empty_char(s[i])){//如果[i]是空格 
    387             string tmp=s.substr(0,i);//不算空格[0,i-1]是否找到一个指令 
    388             if(commap[tmp]!=0){
    389                 solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空格 
    390                 return;
    391             }
    392         }
    393     }
    394     //s没有遇到任何空格,传递整个字符串作为第一级命令,第二级命令是空串 
    395     solve1(s,len,commap[s]);
    396 }
    397 void comsolve_com::init(){
    398     basic_command[code_print]="print";
    399     basic_command[code_windowscmd]="windows";
    400     basic_command[code_exit]="exit";
    401     basic_command[code_sysinfo]="sysinfo";
    402     basic_command[code_help]="help";
    403     basic_command[code_var]="var";
    404     basic_command[code_cls]="cls";
    405     basic_command[code_color]="color";
    406     basic_command[code_runtime]="runtime";
    407     basic_command_cn[code_print]="输出";
    408     basic_command_cn[code_windowscmd]="扩展";
    409     basic_command_cn[code_exit]="退出";
    410     basic_command_cn[code_sysinfo]="系统信息";
    411     basic_command_cn[code_help]="帮助";
    412     basic_command_cn[code_cls]="清屏";
    413     basic_command_cn[code_color]="颜色";
    414     basic_command_cn[code_runtime]="运行时间"; 
    415     for(int i=0;i<Max_basic_command;++i)
    416         commap[basic_command[i]]=i+codecom_base_en;
    417     for(int i=0;i<Max_basic_command;++i)
    418         commap[basic_command_cn[i]]=i+codecom_base_cn;
    419 }
    420 void systemio_com::cleanscr(){
    421     system("cls");
    422 }
    423 void syscore_com::welcomescr(string message){//启动和关闭屏幕 (通过message传递) 
    424     systemio_com::cleanscr();
    425     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
    426     for(int i=1;i<=cnt_emptyl/2;++i)out_com::print("
    ");
    427     welcome_com::about();
    428     out_com::println(message);
    429     for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("
    ");
    430     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
    431 }
    432 void welcome_com::help(){
    433     out_com::println("************Start of help*****************");
    434     out_com::println("1.    command 'print': ");
    435     out_com::println("print {string} System will say {string}.");
    436     out_com::println("eg. print Hello!");
    437     out_com::println("2.    command 'exit': ");
    438     out_com::println("System will close.");
    439     out_com::println("eg. exit");
    440     out_com::println("3.    command 'sysinfo': ");
    441     out_com::println("System will show the information of the System.");
    442     out_com::println("eg. sysinfo");
    443     out_com::println("4.    command 'help': ");
    444     out_com::println("System will show the commands of the System.");
    445     out_com::println("eg. help");
    446     out_com::println("5.    command 'windows': ");
    447     out_com::println("windows {string} system will do it in Windows cmd.exe");
    448     out_com::println("eg. windows echo hello");    
    449     out_com::println("6.    command 'cls': ");
    450     out_com::println("System will clean the screen.");
    451     out_com::println("eg. cls");    
    452     out_com::println("7.     command 'color':");
    453     out_com::println("System will change the color to {string}");
    454     out_com::println("eg. color 0a");
    455     out_com::println("8.    command 'runtime': ");
    456     out_com::println("System will show the runtime(ms)");
    457     out_com::println("eg. runtime");
    458     out_com::println("************End of help*****************");
    459 }
    460 void syscore_com::startsys(){
    461     systemio_com::changeclr("0f");
    462     systemio_com::windowscmd("title ComSys");
    463     welcomescr("Starting...");
    464     initsys();
    465     systemio_com::sleep_until(waitms);
    466     systemio_com::cleanscr();
    467     out_com::println("System has got ready.");
    468     sysmain();
    469 } 
    470 void syscore_com::initsys(){
    471     storage_com::init();
    472     comsolve_com::init();
    473 }
    474 void syscore_com::closesys(){
    475     systemio_com::cleanscr();
    476     welcomescr("System is shutting down...");
    477     systemio_com::sleep(waitms);
    478     out_com::println("Press any key to exit.");
    479     systemio_com::windowscmd("pause >nul");
    480     systemio_com::progexit(0);
    481 }
    482 void syscore_com::closetimeout(int m_secs){
    483     printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000);
    484     systemio_com::sleep(m_secs);
    485     closesys();
    486 }
    487 void syscore_com::sysmain(){
    488     welcome_com::sysstarttime=systemio_com::gettime();
    489     string s;
    490     while(1){
    491         out_com::print(">");
    492         in_com::readln(s);
    493         strext_com::trim(s);//去掉首尾空格 
    494         if(!s.empty())
    495             comsolve_com::solve0(s);
    496     }
    497 }
    498 int storage_com::getInteger(string name){
    499     varinfo var=varmap[name];
    500     if(var.type==code_integer){
    501         return Ints[var.address];
    502     }else{
    503         err_com::throwln(code_err_wrongtype);
    504         return 0;
    505     }
    506 }
    507 double storage_com::getFloating(string name){
    508     varinfo var=varmap[name];
    509     if(var.type==code_floating){
    510         return Floats[var.address];
    511     }else{
    512         err_com::throwln(code_err_wrongtype);
    513         return 0;
    514     }
    515 }
    516 string storage_com::getString(string name){
    517     varinfo var=varmap[name];
    518     if(var.type==code_string){
    519         return Strings[var.address];
    520     }else{
    521         err_com::throwln(code_err_wrongtype);
    522         return "";
    523     }
    524 }
    525 void storage_com::putvalue(string name,long long val){
    526     varinfo var=varmap[name];
    527     if(var.type==code_void){
    528         Ints.push_back(val);
    529         var=varinfo(name,code_integer,Ints.size()-1);
    530         varmap[name]=var;
    531     }else if(var.type==code_integer){//此变量存在 
    532         Ints[var.address]=val;
    533     }else{//注意,以下会出现在内存池中变量的内存泄露 
    534         Ints.push_back(val);
    535         var=varinfo(name,code_integer,Ints.size()-1);
    536         varmap[name]=var;
    537         //将之前的存储信息覆盖(之前的内存将永远无法用到) 
    538     }    
    539 }
    540 void storage_com::putvalue(string name,int val){
    541     putvalue(name,val);
    542 }
    543 void storage_com::putvalue(string name,string val){
    544     varinfo var=varmap[name];
    545     if(var.type==code_void){
    546         Strings.push_back(val);
    547         var=varinfo(name,code_string,Strings.size()-1);
    548         varmap[name]=var;
    549     }else if(var.type==code_string){
    550         Strings[var.address]=val;
    551     }else{ 
    552         Strings.push_back(val);
    553         var=varinfo(name,code_string,Strings.size()-1);
    554         varmap[name]=var;
    555     }
    556 }
    557 void storage_com::putvalue(string name,double val){
    558     varinfo var=varmap[name];
    559     const int type=var.type;
    560     if(type==code_void){
    561         Floats.push_back(val);
    562         var=varinfo(name,code_floating,Floats.size()-1);
    563         varmap[name]=var;
    564     }else if(type==code_floating){
    565         Floats[var.address]=val;
    566     }else{ 
    567         Floats.push_back(val);
    568         var=varinfo(name,code_floating,Floats.size()-1);
    569         varmap[name]=var;
    570     }
    571 }
    572 int storage_com::gettype(string name){
    573     varinfo ret=varmap[name];
    574     return ret.type;    
    575 }
    576 string storage_com::getvarstr(varinfo var){
    577     const int type=var.type,address=var.address;
    578     string ret;
    579     std::stringstream stream;
    580     if(type==code_integer){
    581         stream<<Ints.at(address);
    582     }else if (type==code_string){
    583         stream<<Strings.at(address);
    584     }else if (type==code_floating){
    585         stream<<Floats.at(address);
    586     }else{
    587         return code_str_void;
    588     }
    589     stream>>ret;
    590     return ret;
    591 }
    592 string storage_com::getvarstr(string name){
    593     varinfo var=varmap[name];
    594     return getvarstr(var);
    595 }
    596 void storage_com::printvarstr(string name){
    597     out_com::print(getvarstr(name));
    598 }
    599 void storage_com::printvarstrln(string name){
    600     out_com::println(getvarstr(name));
    601 }
    602 /*下面的未完结 */
    603 void storage_com::solve0(string s){//s是storage命令处理 
    604     int len=s.length();
    605     strext_com::trim(s);
    606     for(int i=0;i<len;++i){//枚举i,一直到结尾 
    607         if(strext_com::is_empty_char(s[i])){//分格的空格s[i]
    608             string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名
    609             varinfo tmpinfo=varmap[tmp]; 
    610             //不管这个变量存不存在 ,都转交下层处理 [i+1,end]跳过刚才的空白 
    611             //solve1(s,i+1,tmpinfo);
    612             return;//分隔符之后的不再处理 
    613         }
    614     }
    615     err_com::throwln("Var Command Error.");
    616 }
    617 /*未完结 
    618 void storage_com::solve1(string str,int left,varinfo var){
    619     int len=str.length();
    620     string s=str.substr(left,len-left);
    621     for(int i=0;i<len;++i){
    622         if(strext_com::is_empty_char(s[i]))
    623     }
    624     string type_tmp=s.strstr(0,)
    625 }*/
    626 void storage_com::init(){
    627     vector<Integer>().swap(Ints);
    628     vector<Floating>().swap(Floats);
    629     vector<String>().swap(Strings);
    630     map<string,varinfo>().swap(varmap);
    631     map<string,type_t>().swap(typemap);
    632     typemap[code_str_void]=code_void;
    633     typemap[code_str_integer]=code_integer;
    634     typemap[code_str_floating]=code_floating;
    635     typemap[code_str_string]=code_string;
    636 }
    637 int main(){
    638     syscore_com::startsys();
    639     return 0;
    640 }
    0.2.0.1
      1 /*每个类依赖功能的类:
      2     comsolve_com:几乎所有
      3     err_com: syscore_com systemio_com out_com
      4     in_com:无
      5     out_com:无
      6     storage_com:懒得写了
      7     strext_com:无
      8     syscore_com:
      9         systemio_com
     10         out_com
     11         storage_com
     12         comsolve_com
     13         in_com
     14         strext_com
     15     systemio_com: 无
     16     welcome_com: out_com
     17 */
     18 /************更新日志*************************** 
     19 0.0.1:    基本的框架和命令基础 
     20 0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备
     21 0.1.0: 在底层支持了Integer类型 
     22 0.1.1: 优化了用户交互、完善了代码注释 
     23 0.1.2: 添加了广告
     24 0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 
     25 0.1.4:    1.添加了"cls"指令 用于清屏 
     26         2. storage 已经支持Integer/Floating/String全类型 
     27         3. 现在命令首尾如果有空格会自动忽略(trim函数) 
     28         4.支持通过varinfo string 来输出变量的内容 
     29 0.1.4 patch 1: 1.修复了bug;添加了 cls 指令在help内 
     30 0.1.5:    1.添加了syscore_com 类 拆分了welcome_com的一些功能
     31          2.整合了开始屏幕和关闭屏幕欢迎信息
     32         3.添加了"welcome::about()"包含系统信息和广告 
     33         4.更改了版本号系统[x.x.x.x] 最后一位是补丁号 
     34 0.2.0:    TestEdition 1:
     35         1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度 
     36         2.现在版本号已经包含在welcome_com中
     37         3.已经在comsolve_com里添加了中文命令的定义 
     38         Test Edition 2:
     39         4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
     40         5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖) 
     41         6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition] 
     42         7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
     43         8.重磅更新:comsolve_com::varsole(string s)已经可用
     44             用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它” 
     45         9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
     46         10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色 
     47         11.优化了多语言 
     48         patch 0:
     49         12.为正式版优化GUI  
     50         13.添加了runtime 命令 获取系统从开始到当前时刻的时间 
     51         14.补全了测试版的一些命令相关(中文,help)
     52         patch 1:
     53         1.完善了注释
     54         2.sysinfo 修复bug:系统启动时间显示没有冒号
     55         3.新功能:现在程序标题栏会显示ComSys
     56         4.systemio_com::重写了sleep(int),添加了sleep_until(int),
     57         5.令syscore_com::startsys改用sleep_until 加快启动时间
     58         6.对storage_com 的整理 
     59 ***********************************************/ 
     60 #include<iostream>
     61 #include<string>
     62 #include<cstdlib> 
     63 #include<vector>
     64 #include<map>
     65 #include<ctime>
     66 #include<cstdio>
     67 #include<sstream>
     68 using std::cin;
     69 using std::cout;
     70 using std::string;
     71 using std::endl;
     72 using std::vector;
     73 using std::map;
     74 class strext_com{//字符串处理扩展功能 
     75     public:
     76         static void trim(string &s){//删除字符串首尾空格 
     77             if(s.empty()) return;
     78             s.erase(0,s.find_first_not_of(' '));
     79                 s.erase(s.find_last_not_of(' ') + 1);
     80         }
     81         static bool is_empty_char(char c){
     82             return c==' '|| c=='
    ';
     83         }
     84 };
     85 class out_com{//字符串输出 
     86     public:
     87         static void print(string s);//输出 
     88         static void print(string s,int from);//从第from开始输出,一直到最后 
     89         static void println(string s);//输出并换行 
     90         static void println(string s,int from);//从from开始输出,并换行     
     91 };
     92 class err_com{//错误处理 
     93     public:
     94     static void throwln(string s);//输出错误信息 
     95     static void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 
     96 };
     97 class fileio_com{//文件输入输出(还没写)
     98 };
     99 class in_com{//字符串输入 
    100     public:
    101         static void read(string &s);//输入(空白作结尾符号) 
    102         static void readln(string &s); //输入(换行作结尾符号) 
    103 };
    104 class systemio_com{ //依赖于Windows io的功能 
    105     public:                 
    106     static void windowscmd(string s){//直接在cmd里面执行指令 
    107         system(s.c_str());
    108     }
    109     static progexit(int code){//退出程序并且错误码为code 
    110         exit(code);
    111     }
    112     static void cleanscr();//清屏 
    113     static sleep_until(int k){ //暂停到k毫秒 
    114         while(gettime()<=k);
    115     }
    116     static sleep(int k){//暂停k毫秒
    117         sleep_until(gettime()+k);
    118     }
    119     static void changeclr(string s){//改变程序颜色 
    120         string tmp="color "+s;
    121         system(tmp.c_str());
    122     }
    123     static int gettime(){ //获取程序运行的时间 
    124         return clock();
    125     }
    126 };
    127 class welcome_com{//系统欢迎与用户界面(并不是系统核心) 
    128     public:
    129         static const int vernum1=0,vernum2=2,vernum3=0,verpatch=1;
    130         static int sysstarttime;//系统启动的时间 
    131         static void sysinfo();//系统信息 
    132         static void help();//输出帮助信息
    133         static void advertisements();//输出广告 
    134         static void about();//输出关于信息 
    135 };
    136 int welcome_com::sysstarttime=-1;//开机之前,sysstarttime初始值-1毫秒 
    137 class storage_com{//存储管理 
    138     public:
    139         static const int code_void=0,//空类型 
    140                         code_integer=1,//整数 
    141                         code_floating=2,//浮点数 
    142                         code_string=3;//字符串
    143         struct varinfo{//保存变量信息的数据结构 
    144             string name;
    145             int type;
    146             int address;
    147             varinfo(int a=0,int b=0):type(a),address(b){}
    148             varinfo(string a,int b,int c):name(a),type(b),address(c){}
    149         };
    150         typedef int type_t;//存储类型的类型 
    151         typedef long long Integer;//Integer:long long
    152         typedef double Floating;//Floating: double
    153         typedef string String;//String: string
    154         static vector<Integer> Ints;//保存Integer 的数组 
    155         static vector<Floating> Floats;//保存Floating的数组 
    156         static vector<String> Strings;//保存String的数组 
    157         static map<string,varinfo> varmap;//string->varinfo的映射 
    158         static map<string,type_t> typemap;//string->type的映射 
    159         static const string
    160             code_str_void,
    161             code_str_integer,
    162             code_str_floating,
    163             code_str_string;
    164         static const string
    165             code_err_wrongtype;
    166     public:
    167         storage(){}
    168         static void init();
    169         static int gettype(string name);//获得变量名name的类型 
    170         static void putvalue(string name,long long val);//将变量名name的值设为val
    171         static void putvalue(string name,int val); 
    172         static void putvalue(string name,string val);
    173         static void putvalue(string name,double val);
    174         static int getInteger(string name);//获得name的int值 
    175         static String getString(string name);
    176         static double getFloating(string name);
    177         static string getvarstr(varinfo var);
    178         static string getvarstr(string name);
    179         static void printvarstr(string name);
    180         static void printvarstrln(string name);
    181         static void solve0(string command);
    182 
    183 };
    184 const string storage_com::code_str_void="VOID",
    185             storage_com::code_str_integer="INTEGER",
    186             storage_com::code_str_floating="FLOATING",
    187             storage_com::code_str_string="STRING",
    188             storage_com::code_err_wrongtype="Wrong Type";
    189 vector<storage_com::Integer> storage_com::Ints;//保存Integer 的数组 
    190 vector<storage_com::Floating> storage_com::Floats;//保存Floating的数组 
    191 vector<storage_com::String> storage_com::Strings;//保存String的数组 
    192 map<string,storage_com::varinfo> storage_com::varmap;//string->varinfo的映射 
    193 map<string,storage_com::type_t> storage_com::typemap;
    194 class syscore_com{//系统核心
    195     public:
    196         static const int cnt_stars=80,cnt_emptyl=8,waitms=3000;
    197         static const string version;//版本号提示
    198         static void closesys();//关闭系统 
    199         static void startsys();//启动和初始化 
    200         static void initsys();//延迟初始化 
    201         static void closetimeout(int m_secs);//延迟关闭(毫秒) 
    202         static void welcomescr(string message);//开始和关闭画面 
    203         static void sysmain();//系统运行的重要内容 
    204 };
    205 class comsolve_com{//指令处理 
    206     public:
    207         static const int Max_basic_command=100;//最大命令数目(现在只有8个) 
    208         static const int
    209             codecom_base_en=Max_basic_command*0,
    210             codecom_base_cn=Max_basic_command*1;        
    211         static const int 
    212             code_unknown=0,//错误指令 
    213             code_print=1,
    214             code_windowscmd=2,
    215             code_exit=3,
    216             code_sysinfo=4,
    217             code_help=5,
    218             code_var=6,
    219             code_cls=7,
    220             code_color=8,
    221             code_runtime=9;
    222         static const char 
    223             code_varflag0='%';//变量出现的标志 
    224         static string basic_command_cn[Max_basic_command];
    225         static string basic_command[Max_basic_command];//指令代号->指令名的映射 
    226         static map<string,int> commap;//指令名->指令代号的映射 
    227     private:
    228         //static void push_command(string s,int code,int codebase);
    229     public:
    230         static void init();//初始化 
    231         static void solve0(string s);//第一步处理
    232         static void solve1(string s,int left,int code_raw);//第二步命令处理 
    233         static string varsolve(string s);//把字符串中的变量替换成所代表的的值
    234 };
    235 string comsolve_com::basic_command[Max_basic_command];//指令代号->指令名的映射
    236 string comsolve_com::basic_command_cn[Max_basic_command]; 
    237 map<string,int> comsolve_com::commap;//指令名->指令代号的映射 
    238 class System_com{//基本功能(几乎无需初始化) 
    239     public:
    240         out_com out;
    241         err_com err;
    242         in_com in;
    243         systemio_com sysio;
    244         fileio_com fileio;
    245         welcome_com wel;
    246         syscore_com syscore;
    247     System_com(){}
    248 };
    249 class Systemext_com{//基本拓展功能(可能需要初始化) 
    250     public:
    251         storage_com var;
    252         comsolve_com comsolve;
    253     Systemext_com(){}
    254 }; 
    255 void out_com::print(string s){
    256     print(s,0);
    257 }
    258 void out_com::println(string s){
    259     println(s,0);
    260 }
    261 void out_com::print(string s,int from){
    262     int len=s.length();
    263     string s1=s.substr(from,len-from);
    264     cout<<s1;
    265 }
    266 void out_com::println(string s,int from){
    267     print(s,from);cout<<endl;
    268 }
    269 void in_com::read(string &s){
    270     cin>>s;
    271 }
    272 void in_com::readln(string &s){
    273     getline(cin,s);
    274 }
    275 void err_com::throwln(string s){
    276     systemio_com::windowscmd("color 1f"); //color 1 3 9是蓝色 
    277     out_com::println("System Error:There is a problem:");
    278     out_com::println(s);
    279 }
    280 void err_com::throwshut(string s,int timeout){
    281     throwln(s);
    282     syscore_com::closetimeout(timeout);
    283 } 
    284 void welcome_com::sysinfo(){
    285     std::stringstream versionstream,timestream;
    286     versionstream<<"[Version:"<<vernum1<<"."<<vernum2<<"."<<vernum3<<"."<<verpatch<<"]";
    287     timestream<<sysstarttime<<"(ms)]";
    288     if(verpatch<0) versionstream<<"[TestEdition]";
    289     string versionstring,timestring;
    290     versionstream>>versionstring;
    291     timestream>>timestring;
    292     timestring="[System start time:"+timestring;
    293     out_com::println("[Command Operatoring System]");
    294     out_com::println("[This system is designed by CDsidi.]");
    295     out_com::println(versionstring);
    296     if(sysstarttime!=-1){
    297         out_com::println(timestring);
    298     }
    299 }
    300 void welcome_com::advertisements(){
    301     if(verpatch<=-1){
    302         out_com::println("********Test Edition: No Advertisement*********");
    303         return;
    304     }
    305     out_com::println("****************以下是广告*************");
    306     out_com::println("_______广告 1_________ ");    
    307     out_com::println("如果喜欢ComSys,请捐助我 ");    
    308     out_com::println("如果想投放广告,请联系我 ");
    309     out_com::println("https://www.cnblogs.com/cdsidi");
    310     out_com::println("_______广告 2_________ ");    
    311     out_com::println("现在加入 51C SB 派对!");
    312     out_com::println("****************广告已结束*************");
    313 }
    314 void welcome_com::about(){
    315     sysinfo();
    316     advertisements();
    317 };
    318 //这里有bug 先不用了 
    319 string comsolve_com::varsolve(string s){//将%varname%替换为var的值 
    320     string ret=s;
    321     int len=s.length(),
    322         lastplace=-1;//上一个没有配对的varflag位置 
    323     for(int i=0;i<len;++i){
    324         if(s.at(i)==code_varflag0){
    325             if(lastplace==-1){
    326                 lastplace=i;
    327             }else{
    328                 string varname=s.substr(lastplace+1,i-(lastplace+1));//恰好截取varflag中间的部分 
    329                 if(!varname.empty()){
    330                     string varstr=storage_com::getvarstr(varname);
    331                     if(varstr==storage_com::code_str_void) continue; 
    332                     ret.erase(lastplace,i-lastplace+1);//删除ret从lastplace开始,一直到i的部分[lastplace,i]
    333                     ret.replace(lastplace,0,varstr);
    334                     lastplace=-1;
    335                     int tmp=varstr.length()-(varname.length()+2);//当前指针i的变化量
    336                     i+=tmp;
    337                     len+=tmp;
    338                 }else{
    339                     //lastplace=i; 
    340                 }
    341             }
    342         }
    343     }
    344     for(int i=1;i<len;++i){//将两个连续的'%'编程一个'%' 
    345         if(ret.at(i)==code_varflag0 && ret.at(i-1)==code_varflag0){
    346             ret.erase(i,1);
    347             i-=1;
    348             len-=1;
    349         }
    350     }
    351     return ret;
    352 }
    353 void comsolve_com::solve1(string s,int left,int code_raw){
    354     int base=code_raw/Max_basic_command,//语言基值 
    355         code=code_raw%Max_basic_command;//命令名 
    356     int len=s.length();
    357     string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 
    358     switch(code){
    359         case code_unknown:
    360             out_com::println("Bad command.
    Please type 'help' for help of commands.");break;
    361         case code_print:
    362             out_com::println(tmp);break;
    363         case code_windowscmd:
    364             systemio_com::windowscmd(tmp);break;
    365         case code_exit:
    366             syscore_com::closesys();break;
    367         case code_sysinfo:
    368             welcome_com::sysinfo();break;
    369         case code_help:
    370             welcome_com::help();break;
    371         case code_var:
    372             storage_com::solve0(tmp);break;
    373         case code_cls:
    374             systemio_com::cleanscr();break;
    375         case code_color:
    376             systemio_com::changeclr(tmp);break;
    377         case code_runtime:
    378             cout<<systemio_com::gettime()<<"(ms)"<<endl;break;
    379         default:
    380             err_com::throwln("Bad Command!");
    381     }
    382 }
    383 void comsolve_com::solve0(string s){
    384     int len=s.length();
    385     for(int i=0;i<len;++i){//枚举第一级命令的结尾
    386         if(strext_com::is_empty_char(s[i])){//如果[i]是空格 
    387             string tmp=s.substr(0,i);//不算空格[0,i-1]是否找到一个指令 
    388             if(commap[tmp]!=0){
    389                 solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空格 
    390                 return;
    391             }
    392         }
    393     }
    394     //s没有遇到任何空格,传递整个字符串作为第一级命令,第二级命令是空串 
    395     solve1(s,len,commap[s]);
    396 }
    397 void comsolve_com::init(){
    398     basic_command[code_print]="print";
    399     basic_command[code_windowscmd]="windows";
    400     basic_command[code_exit]="exit";
    401     basic_command[code_sysinfo]="sysinfo";
    402     basic_command[code_help]="help";
    403     basic_command[code_var]="var";
    404     basic_command[code_cls]="cls";
    405     basic_command[code_color]="color";
    406     basic_command[code_runtime]="runtime";
    407     basic_command_cn[code_print]="输出";
    408     basic_command_cn[code_windowscmd]="扩展";
    409     basic_command_cn[code_exit]="退出";
    410     basic_command_cn[code_sysinfo]="系统信息";
    411     basic_command_cn[code_help]="帮助";
    412     basic_command_cn[code_cls]="清屏";
    413     basic_command_cn[code_color]="颜色";
    414     basic_command_cn[code_runtime]="运行时间"; 
    415     for(int i=0;i<Max_basic_command;++i)
    416         commap[basic_command[i]]=i+codecom_base_en;
    417     for(int i=0;i<Max_basic_command;++i)
    418         commap[basic_command_cn[i]]=i+codecom_base_cn;
    419 }
    420 void systemio_com::cleanscr(){
    421     system("cls");
    422 }
    423 void syscore_com::welcomescr(string message){//启动和关闭屏幕 (通过message传递) 
    424     systemio_com::cleanscr();
    425     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
    426     for(int i=1;i<=cnt_emptyl/2;++i)out_com::print("
    ");
    427     welcome_com::about();
    428     out_com::println(message);
    429     for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("
    ");
    430     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
    431 }
    432 void welcome_com::help(){
    433     out_com::println("************Start of help*****************");
    434     out_com::println("1.    command 'print': ");
    435     out_com::println("print {string} System will say {string}.");
    436     out_com::println("eg. print Hello!");
    437     out_com::println("2.    command 'exit': ");
    438     out_com::println("System will close.");
    439     out_com::println("eg. exit");
    440     out_com::println("3.    command 'sysinfo': ");
    441     out_com::println("System will show the information of the System.");
    442     out_com::println("eg. sysinfo");
    443     out_com::println("4.    command 'help': ");
    444     out_com::println("System will show the commands of the System.");
    445     out_com::println("eg. help");
    446     out_com::println("5.    command 'windows': ");
    447     out_com::println("windows {string} system will do it in Windows cmd.exe");
    448     out_com::println("eg. windows echo hello");    
    449     out_com::println("6.    command 'cls': ");
    450     out_com::println("System will clean the screen.");
    451     out_com::println("eg. cls");    
    452     out_com::println("7.     command 'color':");
    453     out_com::println("System will change the color to {string}");
    454     out_com::println("eg. color 0a");
    455     out_com::println("8.    command 'runtime': ");
    456     out_com::println("System will show the runtime(ms)");
    457     out_com::println("eg. runtime");
    458     out_com::println("************End of help*****************");
    459 }
    460 void syscore_com::startsys(){
    461     systemio_com::changeclr("0f");
    462     systemio_com::windowscmd("title ComSys");
    463     welcomescr("Starting...");
    464     initsys();
    465     systemio_com::sleep_until(waitms);
    466     systemio_com::cleanscr();
    467     out_com::println("System has got ready.");
    468     sysmain();
    469 } 
    470 void syscore_com::initsys(){
    471     storage_com::init();
    472     comsolve_com::init();
    473 }
    474 void syscore_com::closesys(){
    475     systemio_com::cleanscr();
    476     welcomescr("System is shutting down...");
    477     systemio_com::sleep(waitms);
    478     out_com::println("Press any key to exit.");
    479     systemio_com::windowscmd("pause >nul");
    480     systemio_com::progexit(0);
    481 }
    482 void syscore_com::closetimeout(int m_secs){
    483     printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000);
    484     systemio_com::sleep(m_secs);
    485     closesys();
    486 }
    487 void syscore_com::sysmain(){
    488     welcome_com::sysstarttime=systemio_com::gettime();
    489     string s;
    490     while(1){
    491         out_com::print(">");
    492         in_com::readln(s);
    493         strext_com::trim(s);//去掉首尾空格 
    494         if(!s.empty())
    495             comsolve_com::solve0(s);
    496     }
    497 }
    498 int storage_com::getInteger(string name){
    499     varinfo var=varmap[name];
    500     if(var.type==code_integer){
    501         return Ints[var.address];
    502     }else{
    503         err_com::throwln(code_err_wrongtype);
    504         return 0;
    505     }
    506 }
    507 double storage_com::getFloating(string name){
    508     varinfo var=varmap[name];
    509     if(var.type==code_floating){
    510         return Floats[var.address];
    511     }else{
    512         err_com::throwln(code_err_wrongtype);
    513         return 0;
    514     }
    515 }
    516 string storage_com::getString(string name){
    517     varinfo var=varmap[name];
    518     if(var.type==code_string){
    519         return Strings[var.address];
    520     }else{
    521         err_com::throwln(code_err_wrongtype);
    522         return "";
    523     }
    524 }
    525 void storage_com::putvalue(string name,long long val){
    526     varinfo var=varmap[name];
    527     if(var.type==code_void){
    528         Ints.push_back(val);
    529         var=varinfo(name,code_integer,Ints.size()-1);
    530         varmap[name]=var;
    531     }else if(var.type==code_integer){//此变量存在 
    532         Ints[var.address]=val;
    533     }else{//注意,以下会出现在内存池中变量的内存泄露 
    534         Ints.push_back(val);
    535         var=varinfo(name,code_integer,Ints.size()-1);
    536         varmap[name]=var;
    537         //将之前的存储信息覆盖(之前的内存将永远无法用到) 
    538     }    
    539 }
    540 void storage_com::putvalue(string name,int val){
    541     putvalue(name,val);
    542 }
    543 void storage_com::putvalue(string name,string val){
    544     varinfo var=varmap[name];
    545     if(var.type==code_void){
    546         Strings.push_back(val);
    547         var=varinfo(name,code_string,Strings.size()-1);
    548         varmap[name]=var;
    549     }else if(var.type==code_string){
    550         Strings[var.address]=val;
    551     }else{ 
    552         Strings.push_back(val);
    553         var=varinfo(name,code_string,Strings.size()-1);
    554         varmap[name]=var;
    555     }
    556 }
    557 void storage_com::putvalue(string name,double val){
    558     varinfo var=varmap[name];
    559     const int type=var.type;
    560     if(type==code_void){
    561         Floats.push_back(val);
    562         var=varinfo(name,code_floating,Floats.size()-1);
    563         varmap[name]=var;
    564     }else if(type==code_floating){
    565         Floats[var.address]=val;
    566     }else{ 
    567         Floats.push_back(val);
    568         var=varinfo(name,code_floating,Floats.size()-1);
    569         varmap[name]=var;
    570     }
    571 }
    572 int storage_com::gettype(string name){
    573     varinfo ret=varmap[name];
    574     return ret.type;    
    575 }
    576 string storage_com::getvarstr(varinfo var){
    577     const int type=var.type,address=var.address;
    578     string ret;
    579     std::stringstream stream;
    580     if(type==code_integer){
    581         stream<<Ints.at(address);
    582     }else if (type==code_string){
    583         stream<<Strings.at(address);
    584     }else if (type==code_floating){
    585         stream<<Floats.at(address);
    586     }else{
    587         return code_str_void;
    588     }
    589     stream>>ret;
    590     return ret;
    591 }
    592 string storage_com::getvarstr(string name){
    593     varinfo var=varmap[name];
    594     return getvarstr(var);
    595 }
    596 void storage_com::printvarstr(string name){
    597     out_com::print(getvarstr(name));
    598 }
    599 void storage_com::printvarstrln(string name){
    600     out_com::println(getvarstr(name));
    601 }
    602 /*下面的未完结 */
    603 void storage_com::solve0(string s){//s是storage命令处理 
    604     int len=s.length();
    605     strext_com::trim(s);
    606     for(int i=0;i<len;++i){//枚举i,一直到结尾 
    607         if(strext_com::is_empty_char(s[i])){//分格的空格s[i]
    608             string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名
    609             varinfo tmpinfo=varmap[tmp]; 
    610             //不管这个变量存不存在 ,都转交下层处理 [i+1,end]跳过刚才的空白 
    611             //solve1(s,i+1,tmpinfo);
    612             return;//分隔符之后的不再处理 
    613         }
    614     }
    615     err_com::throwln("Var Command Error.");
    616 }
    617 /*未完结 
    618 void storage_com::solve1(string str,int left,varinfo var){
    619     int len=str.length();
    620     string s=str.substr(left,len-left);
    621     for(int i=0;i<len;++i){
    622         if(strext_com::is_empty_char(s[i]))
    623     }
    624     string type_tmp=s.strstr(0,)
    625 }*/
    626 void storage_com::init(){
    627     vector<Integer>().swap(Ints);
    628     vector<Floating>().swap(Floats);
    629     vector<String>().swap(Strings);
    630     map<string,varinfo>().swap(varmap);
    631     map<string,type_t>().swap(typemap);
    632     typemap[code_str_void]=code_void;
    633     typemap[code_str_integer]=code_integer;
    634     typemap[code_str_floating]=code_floating;
    635     typemap[code_str_string]=code_string;
    636 }
    637 int main(){
    638     syscore_com::startsys();
    639     return 0;
    640 }
    ComSys
    /*每个类依赖功能的类:
        comsolve_com:几乎所有
        err_com: syscore_com systemio_com out_com
        in_com:无
        out_com:无
        storage_com:懒得写了
        strext_com:无
        syscore_com:
            systemio_com
            out_com
            storage_com
            comsolve_com
            in_com
            strext_com
        systemio_com: 无
        welcome_com: out_com
    */
    /************更新日志*************************** 
    0.0.1:    基本的框架和命令基础 
    0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备
    0.1.0: 在底层支持了Integer类型 
    0.1.1: 优化了用户交互、完善了代码注释 
    0.1.2: 添加了广告
    0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 
    0.1.4:    1.添加了"cls"指令 用于清屏 
            2. storage 已经支持Integer/Floating/String全类型 
            3. 现在命令首尾如果有空格会自动忽略(trim函数) 
            4.支持通过varinfo string 来输出变量的内容 
    0.1.4 patch 1: 1.修复了bug;添加了 cls 指令在help内 
    0.1.5:    1.添加了syscore_com 类 拆分了welcome_com的一些功能
             2.整合了开始屏幕和关闭屏幕欢迎信息
            3.添加了"welcome::about()"包含系统信息和广告 
            4.更改了版本号系统[x.x.x.x] 最后一位是补丁号 
    0.2.0:    TestEdition 1:
            1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度 
            2.现在版本号已经包含在welcome_com中
            3.已经在comsolve_com里添加了中文命令的定义 
            Test Edition 2:
            4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
            5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖) 
            6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition] 
            7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
            8.重磅更新:comsolve_com::varsole(string s)已经可用
                用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它” 
            9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
            10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色 
            11.优化了多语言 
            patch 0:
            12.为正式版优化GUI  
            13.添加了runtime 命令 获取系统从开始到当前时刻的时间 
            14.补全了测试版的一些命令相关(中文,help)
            patch 1:
            1.完善了注释
            2.sysinfo 修复bug:系统启动时间显示没有冒号
            3.新功能:现在程序标题栏会显示ComSys
            4.systemio_com::重写了sleep(int),添加了sleep_until(int),
            5.令syscore_com::startsys改用sleep_until 加快启动时间
            6.对storage_com 的整理 
    ***********************************************/ 
    #include<iostream>
    #include<string>
    #include<cstdlib> 
    #include<vector>
    #include<map>
    #include<ctime>
    #include<cstdio>
    #include<sstream>
    using std::cin;
    using std::cout;
    using std::string;
    using std::endl;
    using std::vector;
    using std::map;
    class strext_com{//字符串处理扩展功能 
        public:
            static void trim(string &s){//删除字符串首尾空格 
                if(s.empty()) return;
                s.erase(0,s.find_first_not_of(' '));
                    s.erase(s.find_last_not_of(' ') + 1);
            }
            static bool is_empty_char(char c){
                return c==' '|| c=='
    ';
            }
    };
    class out_com{//字符串输出 
        public:
            static void print(string s);//输出 
            static void print(string s,int from);//从第from开始输出,一直到最后 
            static void println(string s);//输出并换行 
            static void println(string s,int from);//从from开始输出,并换行     
    };
    class err_com{//错误处理 
        public:
        static void throwln(string s);//输出错误信息 
        static void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 
    };
    class fileio_com{//文件输入输出(还没写)
    };
    class in_com{//字符串输入 
        public:
            static void read(string &s);//输入(空白作结尾符号) 
            static void readln(string &s); //输入(换行作结尾符号) 
    };
    class systemio_com{ //依赖于Windows io的功能 
        public:                 
        static void windowscmd(string s){//直接在cmd里面执行指令 
            system(s.c_str());
        }
        static progexit(int code){//退出程序并且错误码为code 
            exit(code);
        }
        static void cleanscr();//清屏 
        static sleep_until(int k){ //暂停到k毫秒 
            while(gettime()<=k);
        }
        static sleep(int k){//暂停k毫秒
            sleep_until(gettime()+k);
        }
        static void changeclr(string s){//改变程序颜色 
            string tmp="color "+s;
            system(tmp.c_str());
        }
        static int gettime(){ //获取程序运行的时间 
            return clock();
        }
    };
    class welcome_com{//系统欢迎与用户界面(并不是系统核心) 
        public:
            static const int vernum1=0,vernum2=2,vernum3=0,verpatch=1;
            static int sysstarttime;//系统启动的时间 
            static void sysinfo();//系统信息 
            static void help();//输出帮助信息
            static void advertisements();//输出广告 
            static void about();//输出关于信息 
    };
    int welcome_com::sysstarttime=-1;//开机之前,sysstarttime初始值-1毫秒 
    class storage_com{//存储管理 
        public:
            static const int code_void=0,//空类型 
                            code_integer=1,//整数 
                            code_floating=2,//浮点数 
                            code_string=3;//字符串
            struct varinfo{//保存变量信息的数据结构 
                string name;
                int type;
                int address;
                varinfo(int a=0,int b=0):type(a),address(b){}
                varinfo(string a,int b,int c):name(a),type(b),address(c){}
            };
            typedef int type_t;//存储类型的类型 
            typedef long long Integer;//Integer:long long
            typedef double Floating;//Floating: double
            typedef string String;//String: string
            static vector<Integer> Ints;//保存Integer 的数组 
            static vector<Floating> Floats;//保存Floating的数组 
            static vector<String> Strings;//保存String的数组 
            static map<string,varinfo> varmap;//string->varinfo的映射 
            static map<string,type_t> typemap;//string->type的映射 
            static const string
                code_str_void,
                code_str_integer,
                code_str_floating,
                code_str_string;
            static const string
                code_err_wrongtype;
        public:
            storage(){}
            static void init();
            static int gettype(string name);//获得变量名name的类型 
            static void putvalue(string name,long long val);//将变量名name的值设为val
            static void putvalue(string name,int val); 
            static void putvalue(string name,string val);
            static void putvalue(string name,double val);
            static int getInteger(string name);//获得name的int值 
            static String getString(string name);
            static double getFloating(string name);
            static string getvarstr(varinfo var);
            static string getvarstr(string name);
            static void printvarstr(string name);
            static void printvarstrln(string name);
            static void solve0(string command);
    
    };
    const string storage_com::code_str_void="VOID",
                storage_com::code_str_integer="INTEGER",
                storage_com::code_str_floating="FLOATING",
                storage_com::code_str_string="STRING",
                storage_com::code_err_wrongtype="Wrong Type";
    vector<storage_com::Integer> storage_com::Ints;//保存Integer 的数组 
    vector<storage_com::Floating> storage_com::Floats;//保存Floating的数组 
    vector<storage_com::String> storage_com::Strings;//保存String的数组 
    map<string,storage_com::varinfo> storage_com::varmap;//string->varinfo的映射 
    map<string,storage_com::type_t> storage_com::typemap;
    class syscore_com{//系统核心
        public:
            static const int cnt_stars=80,cnt_emptyl=8,waitms=3000;
            static const string version;//版本号提示
            static void closesys();//关闭系统 
            static void startsys();//启动和初始化 
            static void initsys();//延迟初始化 
            static void closetimeout(int m_secs);//延迟关闭(毫秒) 
            static void welcomescr(string message);//开始和关闭画面 
            static void sysmain();//系统运行的重要内容 
    };
    class comsolve_com{//指令处理 
        public:
            static const int Max_basic_command=100;//最大命令数目(现在只有8个) 
            static const int
                codecom_base_en=Max_basic_command*0,
                codecom_base_cn=Max_basic_command*1;        
            static const int 
                code_unknown=0,//错误指令 
                code_print=1,
                code_windowscmd=2,
                code_exit=3,
                code_sysinfo=4,
                code_help=5,
                code_var=6,
                code_cls=7,
                code_color=8,
                code_runtime=9;
            static const char 
                code_varflag0='%';//变量出现的标志 
            static string basic_command_cn[Max_basic_command];
            static string basic_command[Max_basic_command];//指令代号->指令名的映射 
            static map<string,int> commap;//指令名->指令代号的映射 
        private:
            //static void push_command(string s,int code,int codebase);
        public:
            static void init();//初始化 
            static void solve0(string s);//第一步处理
            static void solve1(string s,int left,int code_raw);//第二步命令处理 
            static string varsolve(string s);//把字符串中的变量替换成所代表的的值
    };
    string comsolve_com::basic_command[Max_basic_command];//指令代号->指令名的映射
    string comsolve_com::basic_command_cn[Max_basic_command]; 
    map<string,int> comsolve_com::commap;//指令名->指令代号的映射 
    class System_com{//基本功能(几乎无需初始化) 
        public:
            out_com out;
            err_com err;
            in_com in;
            systemio_com sysio;
            fileio_com fileio;
            welcome_com wel;
            syscore_com syscore;
        System_com(){}
    };
    class Systemext_com{//基本拓展功能(可能需要初始化) 
        public:
            storage_com var;
            comsolve_com comsolve;
        Systemext_com(){}
    }; 
    void out_com::print(string s){
        print(s,0);
    }
    void out_com::println(string s){
        println(s,0);
    }
    void out_com::print(string s,int from){
        int len=s.length();
        string s1=s.substr(from,len-from);
        cout<<s1;
    }
    void out_com::println(string s,int from){
        print(s,from);cout<<endl;
    }
    void in_com::read(string &s){
        cin>>s;
    }
    void in_com::readln(string &s){
        getline(cin,s);
    }
    void err_com::throwln(string s){
        systemio_com::windowscmd("color 1f"); //color 1 3 9是蓝色 
        out_com::println("System Error:There is a problem:");
        out_com::println(s);
    }
    void err_com::throwshut(string s,int timeout){
        throwln(s);
        syscore_com::closetimeout(timeout);
    } 
    void welcome_com::sysinfo(){
        std::stringstream versionstream,timestream;
        versionstream<<"[Version:"<<vernum1<<"."<<vernum2<<"."<<vernum3<<"."<<verpatch<<"]";
        timestream<<sysstarttime<<"(ms)]";
        if(verpatch<0) versionstream<<"[TestEdition]";
        string versionstring,timestring;
        versionstream>>versionstring;
        timestream>>timestring;
        timestring="[System start time:"+timestring;
        out_com::println("[Command Operatoring System]");
        out_com::println("[This system is designed by CDsidi.]");
        out_com::println(versionstring);
        if(sysstarttime!=-1){
            out_com::println(timestring);
        }
    }
    void welcome_com::advertisements(){
        if(verpatch<=-1){
            out_com::println("********Test Edition: No Advertisement*********");
            return;
        }
        out_com::println("****************以下是广告*************");
        out_com::println("_______广告 1_________ ");    
        out_com::println("如果喜欢ComSys,请捐助我 ");    
        out_com::println("如果想投放广告,请联系我 ");
        out_com::println("https://www.cnblogs.com/cdsidi");
        out_com::println("_______广告 2_________ ");    
        out_com::println("现在加入 51C SB 派对!");
        out_com::println("****************广告已结束*************");
    }
    void welcome_com::about(){
        sysinfo();
        advertisements();
    };
    //这里有bug 先不用了 
    string comsolve_com::varsolve(string s){//将%varname%替换为var的值 
        string ret=s;
        int len=s.length(),
            lastplace=-1;//上一个没有配对的varflag位置 
        for(int i=0;i<len;++i){
            if(s.at(i)==code_varflag0){
                if(lastplace==-1){
                    lastplace=i;
                }else{
                    string varname=s.substr(lastplace+1,i-(lastplace+1));//恰好截取varflag中间的部分 
                    if(!varname.empty()){
                        string varstr=storage_com::getvarstr(varname);
                        if(varstr==storage_com::code_str_void) continue; 
                        ret.erase(lastplace,i-lastplace+1);//删除ret从lastplace开始,一直到i的部分[lastplace,i]
                        ret.replace(lastplace,0,varstr);
                        lastplace=-1;
                        int tmp=varstr.length()-(varname.length()+2);//当前指针i的变化量
                        i+=tmp;
                        len+=tmp;
                    }else{
                        //lastplace=i; 
                    }
                }
            }
        }
        for(int i=1;i<len;++i){//将两个连续的'%'编程一个'%' 
            if(ret.at(i)==code_varflag0 && ret.at(i-1)==code_varflag0){
                ret.erase(i,1);
                i-=1;
                len-=1;
            }
        }
        return ret;
    }
    void comsolve_com::solve1(string s,int left,int code_raw){
        int base=code_raw/Max_basic_command,//语言基值 
            code=code_raw%Max_basic_command;//命令名 
        int len=s.length();
        string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 
        switch(code){
            case code_unknown:
                out_com::println("Bad command.
    Please type 'help' for help of commands.");break;
            case code_print:
                out_com::println(tmp);break;
            case code_windowscmd:
                systemio_com::windowscmd(tmp);break;
            case code_exit:
                syscore_com::closesys();break;
            case code_sysinfo:
                welcome_com::sysinfo();break;
            case code_help:
                welcome_com::help();break;
            case code_var:
                storage_com::solve0(tmp);break;
            case code_cls:
                systemio_com::cleanscr();break;
            case code_color:
                systemio_com::changeclr(tmp);break;
            case code_runtime:
                cout<<systemio_com::gettime()<<"(ms)"<<endl;break;
            default:
                err_com::throwln("Bad Command!");
        }
    }
    void comsolve_com::solve0(string s){
        int len=s.length();
        for(int i=0;i<len;++i){//枚举第一级命令的结尾
            if(strext_com::is_empty_char(s[i])){//如果[i]是空格 
                string tmp=s.substr(0,i);//不算空格[0,i-1]是否找到一个指令 
                if(commap[tmp]!=0){
                    solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空格 
                    return;
                }
            }
        }
        //s没有遇到任何空格,传递整个字符串作为第一级命令,第二级命令是空串 
        solve1(s,len,commap[s]);
    }
    void comsolve_com::init(){
        basic_command[code_print]="print";
        basic_command[code_windowscmd]="windows";
        basic_command[code_exit]="exit";
        basic_command[code_sysinfo]="sysinfo";
        basic_command[code_help]="help";
        basic_command[code_var]="var";
        basic_command[code_cls]="cls";
        basic_command[code_color]="color";
        basic_command[code_runtime]="runtime";
        basic_command_cn[code_print]="输出";
        basic_command_cn[code_windowscmd]="扩展";
        basic_command_cn[code_exit]="退出";
        basic_command_cn[code_sysinfo]="系统信息";
        basic_command_cn[code_help]="帮助";
        basic_command_cn[code_cls]="清屏";
        basic_command_cn[code_color]="颜色";
        basic_command_cn[code_runtime]="运行时间"; 
        for(int i=0;i<Max_basic_command;++i)
            commap[basic_command[i]]=i+codecom_base_en;
        for(int i=0;i<Max_basic_command;++i)
            commap[basic_command_cn[i]]=i+codecom_base_cn;
    }
    void systemio_com::cleanscr(){
        system("cls");
    }
    void syscore_com::welcomescr(string message){//启动和关闭屏幕 (通过message传递) 
        systemio_com::cleanscr();
        for(int i=1;i<=cnt_stars;++i)out_com::print("*");
        for(int i=1;i<=cnt_emptyl/2;++i)out_com::print("
    ");
        welcome_com::about();
        out_com::println(message);
        for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("
    ");
        for(int i=1;i<=cnt_stars;++i)out_com::print("*");
    }
    void welcome_com::help(){
        out_com::println("************Start of help*****************");
        out_com::println("1.    command 'print': ");
        out_com::println("print {string} System will say {string}.");
        out_com::println("eg. print Hello!");
        out_com::println("2.    command 'exit': ");
        out_com::println("System will close.");
        out_com::println("eg. exit");
        out_com::println("3.    command 'sysinfo': ");
        out_com::println("System will show the information of the System.");
        out_com::println("eg. sysinfo");
        out_com::println("4.    command 'help': ");
        out_com::println("System will show the commands of the System.");
        out_com::println("eg. help");
        out_com::println("5.    command 'windows': ");
        out_com::println("windows {string} system will do it in Windows cmd.exe");
        out_com::println("eg. windows echo hello");    
        out_com::println("6.    command 'cls': ");
        out_com::println("System will clean the screen.");
        out_com::println("eg. cls");    
        out_com::println("7.     command 'color':");
        out_com::println("System will change the color to {string}");
        out_com::println("eg. color 0a");
        out_com::println("8.    command 'runtime': ");
        out_com::println("System will show the runtime(ms)");
        out_com::println("eg. runtime");
        out_com::println("************End of help*****************");
    }
    void syscore_com::startsys(){
        systemio_com::changeclr("0f");
        systemio_com::windowscmd("title ComSys");
        welcomescr("Starting...");
        initsys();
        systemio_com::sleep_until(waitms);
        systemio_com::cleanscr();
        out_com::println("System has got ready.");
        sysmain();
    } 
    void syscore_com::initsys(){
        storage_com::init();
        comsolve_com::init();
    }
    void syscore_com::closesys(){
        systemio_com::cleanscr();
        welcomescr("System is shutting down...");
        systemio_com::sleep(waitms);
        out_com::println("Press any key to exit.");
        systemio_com::windowscmd("pause >nul");
        systemio_com::progexit(0);
    }
    void syscore_com::closetimeout(int m_secs){
        printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000);
        systemio_com::sleep(m_secs);
        closesys();
    }
    void syscore_com::sysmain(){
        welcome_com::sysstarttime=systemio_com::gettime();
        string s;
        while(1){
            out_com::print(">");
            in_com::readln(s);
            strext_com::trim(s);//去掉首尾空格 
            if(!s.empty())
                comsolve_com::solve0(s);
        }
    }
    int storage_com::getInteger(string name){
        varinfo var=varmap[name];
        if(var.type==code_integer){
            return Ints[var.address];
        }else{
            err_com::throwln(code_err_wrongtype);
            return 0;
        }
    }
    double storage_com::getFloating(string name){
        varinfo var=varmap[name];
        if(var.type==code_floating){
            return Floats[var.address];
        }else{
            err_com::throwln(code_err_wrongtype);
            return 0;
        }
    }
    string storage_com::getString(string name){
        varinfo var=varmap[name];
        if(var.type==code_string){
            return Strings[var.address];
        }else{
            err_com::throwln(code_err_wrongtype);
            return "";
        }
    }
    void storage_com::putvalue(string name,long long val){
        varinfo var=varmap[name];
        if(var.type==code_void){
            Ints.push_back(val);
            var=varinfo(name,code_integer,Ints.size()-1);
            varmap[name]=var;
        }else if(var.type==code_integer){//此变量存在 
            Ints[var.address]=val;
        }else{//注意,以下会出现在内存池中变量的内存泄露 
            Ints.push_back(val);
            var=varinfo(name,code_integer,Ints.size()-1);
            varmap[name]=var;
            //将之前的存储信息覆盖(之前的内存将永远无法用到) 
        }    
    }
    void storage_com::putvalue(string name,int val){
        putvalue(name,val);
    }
    void storage_com::putvalue(string name,string val){
        varinfo var=varmap[name];
        if(var.type==code_void){
            Strings.push_back(val);
            var=varinfo(name,code_string,Strings.size()-1);
            varmap[name]=var;
        }else if(var.type==code_string){
            Strings[var.address]=val;
        }else{ 
            Strings.push_back(val);
            var=varinfo(name,code_string,Strings.size()-1);
            varmap[name]=var;
        }
    }
    void storage_com::putvalue(string name,double val){
        varinfo var=varmap[name];
        const int type=var.type;
        if(type==code_void){
            Floats.push_back(val);
            var=varinfo(name,code_floating,Floats.size()-1);
            varmap[name]=var;
        }else if(type==code_floating){
            Floats[var.address]=val;
        }else{ 
            Floats.push_back(val);
            var=varinfo(name,code_floating,Floats.size()-1);
            varmap[name]=var;
        }
    }
    int storage_com::gettype(string name){
        varinfo ret=varmap[name];
        return ret.type;    
    }
    string storage_com::getvarstr(varinfo var){
        const int type=var.type,address=var.address;
        string ret;
        std::stringstream stream;
        if(type==code_integer){
            stream<<Ints.at(address);
        }else if (type==code_string){
            stream<<Strings.at(address);
        }else if (type==code_floating){
            stream<<Floats.at(address);
        }else{
            return code_str_void;
        }
        stream>>ret;
        return ret;
    }
    string storage_com::getvarstr(string name){
        varinfo var=varmap[name];
        return getvarstr(var);
    }
    void storage_com::printvarstr(string name){
        out_com::print(getvarstr(name));
    }
    void storage_com::printvarstrln(string name){
        out_com::println(getvarstr(name));
    }
    /*下面的未完结 */
    void storage_com::solve0(string s){//s是storage命令处理 
        int len=s.length();
        strext_com::trim(s);
        for(int i=0;i<len;++i){//枚举i,一直到结尾 
            if(strext_com::is_empty_char(s[i])){//分格的空格s[i]
                string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名
                varinfo tmpinfo=varmap[tmp]; 
                //不管这个变量存不存在 ,都转交下层处理 [i+1,end]跳过刚才的空白 
                //solve1(s,i+1,tmpinfo);
                return;//分隔符之后的不再处理 
            }
        }
        err_com::throwln("Var Command Error.");
    }
    /*未完结 
    void storage_com::solve1(string str,int left,varinfo var){
        int len=str.length();
        string s=str.substr(left,len-left);
        for(int i=0;i<len;++i){
            if(strext_com::is_empty_char(s[i]))
        }
        string type_tmp=s.strstr(0,)
    }*/
    void storage_com::init(){
        vector<Integer>().swap(Ints);
        vector<Floating>().swap(Floats);
        vector<String>().swap(Strings);
        map<string,varinfo>().swap(varmap);
        map<string,type_t>().swap(typemap);
        typemap[code_str_void]=code_void;
        typemap[code_str_integer]=code_integer;
        typemap[code_str_floating]=code_floating;
        typemap[code_str_string]=code_string;
    }
    int main(){
        syscore_com::startsys();
        return 0;
    }
    View Code

    0.2.0更新:

    0.2.0: TestEdition 1:
    1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度
    2.现在版本号已经包含在welcome_com中
    3.已经在comsolve_com里添加了中文命令的定义
    Test Edition 2:
    4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
    5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖)
    6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition]
    7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
    8.重磅更新:comsolve_com::varsole(string s)已经可用
    用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它”
    9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
    10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色
    11.优化了多语言
    patch 0:
    12.为正式版优化GUI
    13.添加了runtime 命令 获取系统从开始到当前时刻的时间
    14.补全了测试版的一些命令相关(中文,help)
    patch 1:
    1.完善了注释
    2.sysinfo 修复bug:系统启动时间显示没有冒号
    3.新功能:现在程序标题栏会显示ComSys
    4.systemio_com::重写了sleep(int),添加了sleep_until(int),
    5.令syscore_com::startsys改用sleep_until 加快启动时间
    6.对storage_com 的整理

  • 相关阅读:
    禁止网页右键、复制、另存为方法
    js循环99乘法口诀
    js点击判断显示或隐藏-21
    js下拉框-5
    js下拉框-4
    纯css下拉
    asp.net core 关于同步等待异步坑及解决办法
    net core http请求响应中间件 及全局异常中间件小计
    生产环境 前后端分离部署 https 跨域cors netcore3.1 部署小计
    csrediscore实现分布式锁 小计
  • 原文地址:https://www.cnblogs.com/cdsidi/p/12671399.html
Copyright © 2011-2022 走看看