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 }
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 }
/*每个类依赖功能的类: 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; }
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 的整理