码迷,mamicode.com
首页 > 其他好文 > 详细

Command Operating System by cdsidi(ComSys) 0.1.x版本陆续更新

时间:2020-03-21 16:33:41      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:准备   换行   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 }
0.1.3

 

Command Operating System by cdsidi(ComSys) 0.1.x版本陆续更新

标签:准备   换行   div   wap   break   代码注释   its   cli   rom   

原文地址:https://www.cnblogs.com/cdsidi/p/12539718.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!