实验一 MiniOS
实验一、命令解释程序的编写实验
商软1班 杨晶晶 201406114102
一、 实验目的
(1)掌握命令解释程序的原理;
(2)掌握简单的DOS调用方法;
(3)掌握C语言编程初步。
二、 实验内容和要求
实验内容
根据教师指定的实验课题,完成设计、编码、测试工作。
实验要求
编写类似于DOS,UNIX的命令行解释程序
(1)自行定义系统提示符
(2)自定义命令集(8-10个)
(3)用户输入HELP以查找命令的帮助
(4)列出命令的功能,区分内部还是外部命令
(5)用户输入QUIT退出
(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。
三、 实验方法、步骤及结果测试
1. 源程序名:MiniOS.c
可执行程序名:MiniOS.exe
2. 原理分析及流程图
1. 命令解释程序的原理:
命令解释程序的主要功能是:
接受和执行一条用户从键盘输入的命令,它通常保存一张命令名字(动词)表,其中记录着所有操作命令及其处理程序的入口地址或有关信息。
2. 命令解释程序实现的两种方式 :
1) 一种是它自身包含了命令的执行代码;
2) 另一种是由专门的“系统程序” 实现,自身不含命令处理代码,也不进行处理,仅仅把这条命令对应的命令文件装入内存执行。例如:在DOS操作系统中,dir、cd、cls等命令的执行代码包含在系统自身内核中,称为内部命令;format、help等命令的执行代码在外部文件中,称为外部命令。
3. 编程实现流程
显示程序提示信息;
While(1)
{ 显示提示符;
接收键盘的字符串;
判断是否quit程序退出指令,是则退出;
判断是否内部命令,并给出相应的信息,否则给出错误信息;
}
显示退出程序信息;
首先查了cmd有哪些命令指示符,分别有什么作用,在自己电脑的cmd输入一些字符看对应的结果。通过在自己电脑输入命令指示符复制到程序的显示输出中,使得用起来像真的一样。
3. 主要程序段及其解释:
1 #include<stdio.h> 2 #include<string.h> //在使用到字符数组时需要使用 3 #include<stdlib.h> 4 void main() 5 { 6 int system(const char *string); 7 //定义数组中的值 8 char cmd[20][20]={"dir","cd","md","rd","cls","date","time","ren","copy","help","quit"}; 9 char str[20]; 10 //Init(str); 11 printf("Microsoft Windows [版本 10.0.10240]\n");//设置标题 12 printf("(C) 2015 Microsoft Corporation. All rights reserved.\n"); 13 while(1)//进入函数循环 14 { 15 printf("\nC:\\Users\\yj>"); 16 gets(str); 17 int i,date; 18 for(i=0; '\0' != str[i]; i++)//for循环遍历s串 19 { 20 if(str[i] >= 'A' && str[i] <= 'Z') //判断是不是大写字母 21 str[i] += 32; //转换成小写 22 } 23 if(strcmp(str,cmd[0])==0)//判断输入单词是否与cmd数组中的对应 24 { 25 //system(str); 26 printf("dir 内部命令:显示一个目录中的文件和子目录\n"); 27 printf("\n驱动器 C 中的卷是 系统\n卷的序列号是 0E33-63F0\n\nC:\Users\yj 的目录\n\n2016/03/19 15:47 <DIR> .\n2016/03/10 16:28 <DIR> Music\n2016/03/12 17:20 <DIR> OneDrive\n2016/03/10 16:28 <DIR> Pictures\n2016/03/10 16:28 <DIR> Saved Games\n2016/03/10 16:28 <DIR> Searches\n2016/03/10 16:28 <DIR> Videos\n 4 个文件 2,159 字节\n 19 个目录 33,779,773,440 可用字节\n"); 28 } 29 else if(strcmp(str,cmd[1])==0) 30 { 31 printf("C:\\Users\\yj\n"); 32 printf("cd 内部命令:显示当前目录的名称或将其更改\n"); 33 } 34 else if(strcmp(str,cmd[2])==0) 35 { 36 system("md"); 37 printf("md 内部命令:建立一个目录或文件夹.dos下面习惯叫目录,win下面习惯叫文件夹\n"); 38 } 39 else if(strcmp(str,cmd[3])==0) 40 { 41 system("rd"); 42 printf("rd 内部命令:删除目录\n"); 43 } 44 else if(strcmp(str,cmd[4])==0) 45 { 46 system("cls"); 47 printf("cls 内部命令:清除屏幕\n"); 48 } 49 else if(strcmp(str,cmd[5])==0) 50 { 51 printf("date 内部命令:显示或设置日期\n"); 52 printf("当前日期: 2016/03/24 周四\n输入新日期: (年月日):\n"); 53 } 54 else if(strcmp(str,cmd[6])==0) 55 { 56 printf("当前时间: 21:45:07.86\n"); 57 printf("time 内部命令:显示或设置系统时间\n"); 58 } 59 else if(strcmp(str,cmd[7])==0) 60 { 61 printf("ren 内部命令:重新命名文件,ren命令的格式是:ren 源文件名目的文件名\n"); 62 } 63 else if(strcmp(str,cmd[8])==0) 64 { 65 printf("copy 内部命令:将至少一个文件复制到另一个位置\n"); 66 } 67 else if(strcmp(str,cmd[9])==0) 68 { 69 printf("dir 显示一个目录中的文件和子目录\n"); 70 printf("cd 显示当前目录的名称或将其更改\n"); 71 printf("md 建立一个目录或文件夹.dos下面习惯叫目录,win下面习惯叫文件夹\n"); 72 printf("rd 删除目录\n"); 73 printf("cls 清除屏幕\n"); 74 printf("date 显示或设置日期\n"); 75 printf("time 显示或设置系统时间\n"); 76 printf("ren 重新命名文件,ren命令的格式是:ren 源文件名目的文件名\n"); 77 printf("copy 将至少一个文件复制到另一个位置\n"); 78 printf("help 提供Windows命令的帮助信息\n"); 79 printf("quit 退出命令解释程序\n"); 80 printf("\n有关工具的详细信息,请参阅联机帮助中的命令行参考。\n"); 81 } 82 else if(strcmp(str,cmd[10])==0) 83 return; 84 else 85 { 86 printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。\n",str); 87 } 88 } 89 }
4. 运行结果及分析
四、 实验总结
一开始觉得这个没什么,听老师说还以为挺简单的,就让用户输入命令符然后输出对应的文字就行啦,可是打代码才发现自己会漏了很多细节的地方,比如要考虑输入是否区分大小写、能否让自己做的也实现真的cmd的功能。因为能力有限,只能做比较简单的内容,实现显示处理命令符的内容是在cmd打相应的命令符把对应的内容复制过去,也尝试了用system(str)的方法直接调用。看了老师的代码发现用读取文档的方式修改会比较方便,而且看起来比较整洁,用结构体的方法更好存放数据,要多学习。