21一个支持sorthelp和quit命令的字符shell.docx
《21一个支持sorthelp和quit命令的字符shell.docx》由会员分享,可在线阅读,更多相关《21一个支持sorthelp和quit命令的字符shell.docx(11页珍藏版)》请在冰豆网上搜索。
21一个支持sorthelp和quit命令的字符shell
河北工业大学计算机软件技术基础(VC)2012年课程设计报告
学院电气信息学院班级C1109班姓名韩国强学号115260成绩____
一、题目:
一个仅支持sort、help和quit命令的字符Shell
二、设计思路
1、总体设计
1)分析程序的功能
2)该程序是通过对计算机输入命令字符,使其执行相应的操作,本程序仅支持sort、help和quit命令的字符Shell,通过help命令执行显示帮助的信息,“sort+参数”命令执行排序操作;quit命令执行退出系统的操作。
3)系统总体结构:
本程序中共有三种命令,quit,help,sort+参数命令:
(1)当执行help命令时,只有一个显示子函数。
模块
函数名称
显示帮助信息
DisplayHelp
(2)当执行quit命令时直接通过break退出程序。
(3)当执行sort+参数命令时,需要多个函数进行数据处理。
模块
函数名称
分离命令符
SeparateCmd
检验前四个字符是否为sort
ExamSort
检验后面参数是否正确
ExamCan
分离数字
SeparateNum
数字排序
NumSort
在该部分中,主要需要克服的困难是如何识别字符命令shell,如何分离字符串中的数字,如何将字符类型的数字装换为整型的数字,主要困难在SeparateNum函数中。
而整个分离数字然后排序的sort命令流程可见下图:
2、各功能模块的设计:
说明各功能模块的实现方法
(1)主函数模块
主函数调用各个子函数,通过if语句对指令进行识别,while
(1)死循环使程序一直循换,直到遇见quit指令,输出显示有help帮助信息,指令不能识别,sort参数错误,将sort后面数字排序输出。
代码参加main函数模块;
2)显示帮助函数模块
通过十个指针数组进行显示,每个指针显示一行输出结果,这样在主函数中,结构比较清晰,不会因为过多的cout使程序结构看起来更加复杂。
代码参见DisplayHelp函数模块;
(3)分离指令函数模块
根据Cmd【i】指令,i根据for循环在有控制的增加,将输入的cmd变量分离,将前四个字符分离出来,然后赋值给中间变量cmdtemp1,如果cmdtemp1和sort相同,则分离指令成功。
代码参见SeparateCmd函数模块;
(4)检验参数函数模块
当分离出指令以后,如果sort后面不是数字,则输出参数错误。
代码参见ExamCan;
5)分离数字函数模块
主要要考虑如何区分不限定个数和位置的空格,还有不限定个数的数字,对于判断数字,它的前一个是空格,后一个字符SDCII码值在0到9的字符之间,这样就能确定数字的开始位置,而检验数字的结束位,也检测它的后一个什么时候出现空格,这样每次检测到总数加1,全局变量n加1,知道遇见‘\0’.
(6)排序函数模块
将分离出来的变量储存到整型数组,利用forfor循环,冒泡法排序。
代码参见NumSort函数;
7)创新设计部分
颜色控制+延时输出
要改变控制台的颜色设置需要调用两个Windows操作系统的API函数。
GetStdHandle函数用来获得当前控制台的句柄,用SetConsoleTextAttribute函数来改变选中控制台的颜色控制。
这两个函数的声明存在于文件中。
可以将这两个调用封装到SetColor函数中。
对于输出的延时,可以调用Sleep函数,使显示更加形象。
俩者也可以有机的结合人到一起进行输出控制
例如:
如果需要改变当前的控制台输出颜色为白底红字,则可以书写如下代码:
#include
voidSetColor(unsignedshortForeColor=7,unsignedshortBackGroundColor=0)//设置显示颜色函数
{
HANDLEhCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,ForeColor+BackGroundColor*0x10);
}
比如:
NumSort函数可以创新如下:
voidNumSort()//冒泡法排序
{
inttemp;
for(inti=0;ifor(intj=0;jif(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
SetColor(4,9);//设置字体颜色
for(intj=0;j{
Sleep(100);//延时输出
cout<}
cout<n=0;
}
3、设计中的主要困难及解决方案
程序中的主要问题是如何将字符串中的数字转换成整型的数字,然后通过冒泡法对其排序,课程设计中的大部分时间都用在了字符串的转换中,主要要考虑如何区分不限定个数和位置的空格,还有不限定个数的数字,对于判断数字,它的前一个是空格,后一个字符SDCII码值在0到9的字符之间,这样就能确定数字的开始位置,而检验数字的结束位,也检测它的后一个什么时候出现空格,这样每次检测到总数加1,全局变量m加1,这样在输出的时候,冒泡中的总数就可以知晓,将分离中的数赋值给数组,排序就轻而易举了。
4、你所设计的程序最终完成的功能
1)说明你编制的程序能完成的功能
输入helpquitsort+参数执行不同的操作;
2)准备的测试数据及运行结果
3.
程序清单
(1)主函数
voidmain()
{
DisplayHelp();
while
(1)
{
cout<<"kcsj->";
cin.getline(cmd,50);
if(strcmp(cmd,"help")==0)
DisplayHelp();
elseif(strcmp(cmd,"quit")==0)
break;
elseif((SeparateCmd(cmd))==1)
//如果分离出的命令为sort返回1
{
if(ExamCan(cmd))
{
SeparateNum(cmd);
NumSort();
}
}
else
cout<<"指令不能识别,请重新输入"<}
}
(2)DisplayHelp函数
VoidDisplayHelp()
{char*p[10]={
"--------------------------------------------------------------------------------",
"--------------------------------------------------------------------------------","使用说明:
","支持俩个命令,sort和quit,quit直接退出程序,help显示帮助,sort后面可以跟不超过10","个数值,然后排序后输出。
","例如:
","sort233454659809","将会把后面的数列升序排序后输出","--------------------------------------------------------------------------------",
"--------------------------------------------------------------------------------"};
for(intm=0;m<10;m++)
cout<
}
(3)SeparateCmd函数
intSeparateCmd(charcmd[])
{
charcmdtemp[5];
for(inti=0;i<4;i++)
cmdtemp[i]=cmd[i];
cmdtemp[4]='\0';
if(strcmp(cmdtemp,"sort")==0)
return1;
else
return0;
}
(4)ExamCan函数
intExamCan(charcmd[])
{
for(intj=4;cmd[j]!
='\0';j++)
{
if(cmd[j]!
='')
if((cmd[j]>'9')||(cmd[j]<'0'))
//如果参数中有ASCII值在'0'-'9'或是等于空格的ASCII为正确
{cout<<"sort参数错误"<return0;
}
}
}
(5)SeparateNum
voidSeparateNum(charcmd[])
{
intcmdtemp2,cmdtemp3;
for(intj=4;cmd[j]!
='\0';j++)
{
if(cmd[j]==''&&cmd[j+1]<='9'&&cmd[j+1]>='0')
//从第一个不为空格的数字开始分离
{
cmdtemp3=0;
for(;cmd[j+1]<='9'&&cmd[j+1]>='0';j++)
//到第二个空格结束
{
cmdtemp2=cmd[j+1]-'0';
cmdtemp3=cmdtemp3*10+cmdtemp2;
}
a[n]=cmdtemp3[0];//赋值给a[n]
n++;
j--;
}
}
}
(6)NumSort函数
voidNumSort()
{//冒泡法排序
inttemp;
for(inti=0;ifor(intj=0;jif(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(intj=0;jcout<cout<n=0;
}
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
我的程序较好的完成了任务中规定的设计内容,并完成了创新要求的设计,运行正确。
自己在课程设计中的表现较为优秀,能独立完成任务。
2、对课题提出更完善的方案
可以制作出更多的shell命令,真正的模拟电脑操作,真正地学以致用。
5、收获及心得体会
(1)课程中实感觉到编程的艰难,以及将想法转变成现实的不容易,也深深体会到一个国家软件工业发展的艰难,创新需付出的汗水很多。
不管是云计算,还是物联网,三网融合这些软件需求很大的新兴产业,对人力资源的需求量很大,对创新的要求也很高,所以,加强大学生创新能力培养很重要。
(2)一个软件的创作过程,可以类比出很多的解决问题的方法。
分析问题—>思路解析->整体框架->初步想法->再构思(调试)>再分析>再解决->解决问题。
日期:
2012年6月29日