标签:准备 换行 div wap break 代码注释 its cli rom
0.1.3版本更新:
1.架构调整:1.将System_com 类拆分,不再从属于System_com 类
2.将System_com 类的功能拆分为 System_com (基本功能,无附加存储)和Systemext_com(基本拓展,有附加存储)
3.所有的Systemext 需要初始化的功能都放在自己的class 的void init() 在System.wel.sysint()系统开启之前调用
2.bug 修复:解决comsolve_com 类输入空行会报错误id99的问题
3.功能改善:
1.现在系统init()完毕之后会提示"System has inited"(很短)
2.按下回车(输入空命令)不会提示任何信息
3.改善了系统启动进程
4.去掉了comsolve_com::code_empty 因为已经在solve0中支持
5.优化了注释和代码美观
1 #include<iostream> 2 #include<string> 3 #include<cstdlib> 4 #include<vector> 5 #include<windows.h> 6 #include<map> 7 #include<cstdio> 8 using std::cin; 9 using std::cout; 10 using std::string; 11 using std::vector; 12 using std::endl; 13 using std::map; 14 bool is_empty_char(char c){ 15 return c==‘ ‘|| c==‘\n‘; 16 } 17 class out_com{//字符串输出 18 public: 19 void print(string s);//输出 20 void print(string s,int from);//从第from开始输出,一直到最后 21 void println(string s);//输出并换行 22 void println(string s,int from);//从from开始输出,并换行 23 }; 24 class err_com{//错误处理 25 public: 26 void throwln(string s);//输出错误信息 27 void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 28 }; 29 class fileio_com{ //文件输入输出(还没写) 30 }; 31 class in_com{//字符串输入 32 public: 33 void read(string &s);//输入(空白作结尾符号) 34 void readln(string &s); //输入(换行作结尾符号) 35 }; 36 class systemio_com{ //依赖于Windows io的功能 37 public: 38 void windowscmd(string s){//直接在cmd里面执行指令 39 system(s.c_str()); 40 } 41 void progexit(int code){//退出程序并且错误码为code 42 exit(code); 43 } 44 void cleanscr();//清屏 45 void sleep(int k){//暂停k毫秒 46 Sleep(k); 47 } 48 }; 49 class welcome_com{//系统欢迎与用户界面(并不是系统核心) 50 public: 51 void sysinfo();//系统信息 52 void startsys();//启动和初始化 53 void startscr();//开启屏幕 54 void closescr();//关闭屏幕 55 void closesys();//关闭系统 56 void initsys();//数据结构初始化 57 void closetimeout(int m_secs);//延迟关闭(毫秒) 58 void sysmain();//系统运行的重要内容 59 void help();//输出帮助信息 60 void advertisements();//输出广告 61 }; 62 class storage_com{//存储管理 63 public: 64 static const int code_void=0,//代号:没有类型 65 code_integer=1,//整数 66 code_floating=2,//浮点数 67 code_string=3;//字符串 68 struct varinfo{//保存变量信息的数据结构 69 string name; 70 int type; 71 int address; 72 varinfo(int a=0,int b=0):type(a),address(b){} 73 varinfo(string a,int b,int c):name(a),type(b),address(c){} 74 }; 75 typedef long long Integer;//Integer:long long 76 typedef double Floating;//Floating: double 77 typedef string String;//String: string 78 vector<Integer> Ints;//保存Integer 的数组 79 vector<Floating> Floats;//保存Floating的数组 80 vector<String> Strings;//保存String的数组 81 map<string,varinfo> varmap;//string->varinfo的映射 82 public://work for int only 83 storage(){ 84 } 85 void init(); 86 int gettype(string name);//获得变量名name的类型 87 void putvalue(string name,int k);//将变量名name的值改为k 88 int getInteger(string name);//获得name的int值 89 void solve0(string command); 90 }; 91 class comsolve_com{//指令处理 92 private://static const int code_ 93 static const int code_unknown=0;//错误指令 94 static const int code_print=1; 95 static const int code_windowscmd=2; 96 static const int code_exit=3; 97 static const int code_sysinfo=4; 98 static const int code_help=5; 99 static const int code_var=6, 100 static const int Max_basic_command=100;//最大命令数目(现在只有8个) 101 string basic_command[Max_basic_command];//指令代号->指令名的映射 102 map<string,int> commap;//指令名->指令代号的映射 103 public: 104 comsolve_com(){ 105 ; 106 } 107 void init();//初始化 108 void solve0(string s);//第一步处理 109 void solve1(string s,int left,int code);//第二步命令处理 110 }; 111 class System_com{//基本功能(几乎无需初始化) 112 public: 113 out_com out; 114 err_com err; 115 in_com in; 116 systemio_com sysio; 117 fileio_com fileio; 118 welcome_com wel; 119 }System; 120 class Systeme_com{//基本拓展功能(可能需要初始化) 121 public: 122 storage_com var; 123 comsolve_com comsolve; 124 }Systemext; 125 void out_com::print(string s){ 126 print(s,0); 127 } 128 void out_com::println(string s){ 129 print(s);cout<<endl; 130 } 131 void out_com::print(string s,int from){ 132 int len=s.length(); 133 string s1=s.substr(from,len-from); 134 cout<<s1; 135 } 136 void out_com::println(string s,int from){ 137 print(s,from);cout<<endl; 138 } 139 void in_com::read(string &s){ 140 cin>>s; 141 } 142 void in_com::readln(string &s){ 143 getline(cin,s); 144 } 145 void err_com::throwln(string s){ 146 System.sysio.windowscmd("color 1f"); //color 1 3 9是蓝色 147 System.wel.sysinfo(); 148 System.out.println("System Error:There is a problem:"); 149 System.out.println(s); 150 } 151 void err_com::throwshut(string s,int timeout){ 152 System.err.throwln(s); 153 System.wel.closetimeout(timeout); 154 } 155 void welcome_com::sysinfo(){ 156 System.out.println("[Command Operatoring System]"); 157 System.out.println("[This system is designed by cdsidi.]"); 158 System.out.println("[Version:0.1.3]"); 159 /************更新日志*************************** 160 0.0.1: 基本的框架和命令基础 161 0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备 162 0.1.0: 在底层支持了Integer类型 163 0.1.1: 优化了用户交互、完善了代码注释 164 0.1.2: 添加了广告 165 0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 166 ***********************************************/ 167 } 168 void welcome_com::advertisements(){ 169 System.out.println("****************以下是广告*************"); 170 System.out.println("如果喜欢这个系统,请捐助我 "); 171 System.out.println("如果想投放广告,请联系我 "); 172 System.out.println("https://www.cnblogs.com/cdsidi"); 173 System.out.println("51C SB 派对!"); 174 System.out.println("****************广告已结束*************"); 175 } 176 void comsolve_com::solve1(string s,int left,int code){ 177 int len=s.length(),tmplen=len-left; 178 string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 179 switch(code){ 180 case code_unknown: 181 System.out.println("Bad command. \n Please type ‘help‘ for help of commands.");break; 182 case code_print: 183 System.out.println(tmp);break; 184 case code_windowscmd: 185 System.sysio.windowscmd(tmp);break; 186 case code_exit: 187 System.wel.closesys();break; 188 case code_sysinfo: 189 System.wel.sysinfo();break; 190 case code_help: 191 System.wel.help();break; 192 case code_var: 193 Systemext.var.solve0(tmp);break; 194 default://这里有问题! 195 printf("Bad command.\n"); 196 //printf("Bad command. id:%d\n",code);break; 197 } 198 } 199 void comsolve_com::solve0(string s){ 200 int len=s.length(); 201 for(int i=0;i<len;++i){//枚举结尾 202 if(is_empty_char(s[i])){//空白[i] 203 string tmp=s.substr(0,i);//不算空白([0,i-1]是否达到 ) 204 if(commap[tmp]!=0){ 205 solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空白 206 return;//该命令运行完毕 207 } 208 } 209 } 210 //中间没有遇到任何命令, 211 solve1(s,len,commap[s]); 212 //left=len:传递一个空串 213 //若是正常命令,则执行,否则BADCOMMAND 214 } 215 void comsolve_com::init(){ 216 basic_command[code_print]=string("print"); 217 basic_command[code_windowscmd]=string("windows"); 218 basic_command[code_exit]=string("exit"); 219 basic_command[code_sysinfo]=string("sysinfo"); 220 basic_command[code_help]="help"; 221 basic_command[code_var]="var"; 222 basic_command[code_empty]=""; 223 for(int i=0;i<Max_basic_command;++i){ 224 commap[basic_command[i]]=i; 225 } 226 } 227 void systemio_com::cleanscr(){ 228 system("cls"); 229 } 230 void welcome_com::startscr(){//启动屏幕 231 int cnt_stars=80,cnt_emptyl=10,waitms=3000; 232 System.sysio.cleanscr(); 233 for(int i=1;i<=cnt_stars;++i)System.out.print("*"); 234 for(int i=1;i<=cnt_emptyl/2;++i)System.out.print("\n"); 235 System.wel.sysinfo(); 236 System.wel.advertisements(); 237 for(int i=1;i<=cnt_emptyl/2;++i)System.out.print("\n"); 238 for(int i=1;i<=cnt_stars;++i)System.out.print("*"); 239 System.out.print("\n"); 240 System.out.println("Starting..."); 241 System.sysio.sleep(waitms); 242 } 243 void welcome_com::closescr(){ 244 System.sysio.cleanscr(); 245 int cnt_stars=80,cnt_emptyl=10,waitms=3000; 246 for(int i=1;i<=cnt_stars;++i)System.out.print("*"); 247 for(int i=1;i<=cnt_emptyl/2;++i)System.out.print("\n"); 248 System.wel.sysinfo(); 249 System.wel.advertisements(); 250 for(int i=1;i<=cnt_emptyl/2;++i)System.out.print("\n"); 251 for(int i=1;i<=cnt_stars;++i)System.out.print("*"); 252 System.out.print("\n"); 253 System.out.println("System is shutting down."); 254 System.sysio.sleep(waitms); 255 //System.sysio.cleanscr(); 256 } 257 void welcome_com::help(){ 258 System.out.println("************Start of help*****************"); 259 System.out.println("1. command ‘print‘: "); 260 System.out.println("print {string} System will say {string}."); 261 System.out.println("eg. print Hello!"); 262 System.out.println("2. command ‘exit‘: "); 263 System.out.println("System will close."); 264 System.out.println("eg. exit"); 265 System.out.println("3. command ‘sysinfo‘: "); 266 System.out.println("System will show the information of the System."); 267 System.out.println("eg. sysinfo"); 268 System.out.println("4. command ‘help‘: "); 269 System.out.println("System will show the commands of the System."); 270 System.out.println("eg. help"); 271 System.out.println("5. command ‘windows‘: "); 272 System.out.println("windows {string} system will do it in Windows cmd.exe"); 273 System.out.println("eg. windows echo hello"); 274 System.out.println("************End of help*****************"); 275 } 276 void welcome_com::startsys(){ 277 System.sysio.windowscmd("color 0f"); 278 System.wel.startscr(); 279 System.wel.initsys(); 280 System.sysio.cleanscr(); 281 System.out.println("System has got ready."); 282 System.wel.sysmain(); 283 } 284 void welcome_com::initsys(){ 285 286 Systemext.comsolve.init(); 287 Systemext.var.init(); 288 System.out.println("System has inited"); 289 } 290 void welcome_com::closesys(){ 291 System.wel.closescr(); 292 System.out.println("Press any key to exit."); 293 System.sysio.windowscmd("pause >nul"); 294 System.sysio.progexit(0); 295 } 296 void welcome_com::closetimeout(int m_secs){ 297 printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000); 298 Sleep(m_secs); 299 System.wel.closesys(); 300 } 301 void welcome_com::sysmain(){ 302 string s; 303 while(1){ 304 System.out.print(">"); 305 System.in.readln(s); 306 if(!s.empty()) 307 Systemext.comsolve.solve0(s); 308 } 309 } 310 int storage_com::getInteger(string name){ 311 varinfo var=varmap[name]; 312 if(var.type==code_integer){ 313 return Ints[var.address]; 314 }else{ 315 // System.err.throwshut("Error Type."); 316 return 0; 317 } 318 } 319 void storage_com::putvalue(string name,int val){ 320 varinfo var=varmap[name]; 321 if(var.type==code_void){ 322 Ints.push_back(val); 323 var=varinfo(name,code_integer,Ints.size()-1); 324 varmap[name]=var; 325 }else if(var.type==code_integer){//此变量存在 326 Ints[var.address]=val; 327 }else{//注意,以下会出现内存泄露 328 Ints.push_back(val); 329 var=varinfo(name,code_integer,Ints.size()-1); 330 varmap[name]=var;//将之前的存储信息覆盖 331 } 332 } 333 int storage_com::gettype(string name){ 334 varinfo ret=varmap[name]; 335 return ret.type; 336 }/*下面这里我没看明白 ,先暂时不用了 */ 337 void storage_com::solve0(string s){//s是storage命令处理 338 int len=s.length(); 339 for(int i=0;i<len;++i){//枚举i,一直到结尾 340 if(!is_empty_char(s[i])){//空白[i] 341 string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名 342 varinfo tmpinfo=varmap[tmp]; 343 if(tmpinfo.type!=0){//如果这个变量存在 344 //solve1(s,i+1,tmpinfo);//转交下层处理,[i+1,end]跳过空白 345 return;//该命令运行完毕 346 } 347 } 348 } 349 System.out.println("Bad type."); 350 } 351 void storage_com::init(){ 352 vector<Integer>().swap(Ints); 353 vector<Floating>().swap(Floats); 354 vector<String>().swap(Strings); 355 varmap.clear(); 356 } 357 int main(){ 358 System.wel.startsys(); 359 return 0; 360 }
Command Operating System by cdsidi(ComSys) 0.1.x版本陆续更新
标签:准备 换行 div wap break 代码注释 its cli rom
原文地址:https://www.cnblogs.com/cdsidi/p/12539718.html