实验一、命令解释程序的编写实验
专业:商软2班 姓名:曾治业 学号:201406114235
一、实验目的
(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. 源程序名:压缩包文件(命令解释.rar)中源程序名 miniOS.c
可执行程序名:miniOS.exe
2. 原理分析及流程图
存储结构:结构体
主要算法:通过文件的保存与读取,把文件的内容保存到结构体数组中。
关键函数:void judge(char str[],int n)//判断命令的对错;
int file()//文件的读取。
void command_function(char str[],int n)//命令功能
3. 主要程序段及其解释:
void judge(char str[],int n)//判断命令的对错
{
int i;
for(i=0;i<=n;i++)
{
if(strcmp(str,"help")==0)
{
for(i=0;i<=n;i++)
{
printf("%s\t%s\n",os[i].command,os[i].commandstate);
}
break;
}
if((strcmp(str,os[i].command)==0)&&(os[i].a==1))
{
printf("\"%s\"是内部命令,输入正确\n",os[i].command);
printf("该命令的作用是:%s\n",os[i].commandstate);
break;
}
else if((strcmp(str,os[i].command)==0)&&(os[i].a==0))
{
printf("\"%s\"是外部命令,输入正确\n",os[i].command);
printf("该命令的作用是:%s\n",os[i].commandstate);
break;
}
else if((strcmp(str,os[i].command)!=0)&&(i==n))
{
printf("'%s'不是内部或外部命令,也不是可运行的程序或批处理文件\n",str);
}
}
}
int file()//文件的读取
{
int i,n;
FILE *fp;
fp=fopen("cmd.txt","r+");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s%s%d",os[i].command,os[i].commandstate,&os[i].a);
n=i;
}
fclose(fp);
return n;
}
void command_function(char str[],int n)//命令功能
{
int i;
for(i=0;i<=n;i++)
{
if(stricmp(str,"cls")==0)
{
system("cls");//清屏
}
}
}
4.运行结果及分析
四、实验总结
工具:VC++6.0,
语言:C语言
主要涉及知识点:文件读取功能,结构体数组存储
总结:
这次实验主要是要掌握熟练使用C语言的文件读取功能,结合结构体数组存储从文件中读到的数据,总体实验难度一般。
在做这个实验的过程中,我了解到了系统大概的运行过程,系统通过调用函数实现基本的功能。
附录:
1 #include2 #include 3 #include<string.h> 4 #include 5 #define N 80 6 struct miniOS 7 { 8 int a;//记录是内部命令还是外部命令 9 char command[10];//记录命令 10 char YON_parameter[20];//记录该命令是否需要参数 11 char commandstate[100];//陈述命令的功能 12 }; 13 struct miniOS os[N]; 14 void judge(char str[],int n)//判断命令的对错 15 { 16 int i; 17 for(i=0;i<=n;i++) 18 { 19 if(stricmp(str,"help")==0) 20 { 21 for(i=0;i<=n;i++) 22 { 23 printf("%s\t%-34s%-20s\n",os[i].command,os[i].commandstate,os[i].YON_parameter); 24 } 25 break; 26 } 27 28 if((stricmp(str,os[i].command)==0)&&(os[i].a==1)) 29 { 30 printf("\"%s\" \"%s\" 是内部命令,输入正确!\n",os[i].command,os[i].YON_parameter); 31 printf("该命令的作用是:%s\n",os[i].commandstate); 32 break; 33 } 34 else if((stricmp(str,os[i].command)==0)&&(os[i].a==0)) 35 { 36 printf("\"%s\" \"%s\" 是外部命令,输入正确!\n",os[i].command,os[i].YON_parameter); 37 printf("该命令的作用是:%s\n",os[i].commandstate); 38 break; 39 } 40 else if((stricmp(str,os[i].command)!=0)&&(i==n)) 41 { 42 printf("'%s'不是内部或外部命令,也不是可运行的程序\n或批处理文件\n",str); 43 } 44 } 45 } 46 void command_function(char str[],int n)//命令功能 47 { 48 int i; 49 for(i=0;i<=n;i++) 50 { 51 if(stricmp(str,"cls")==0) 52 { 53 system("cls");//清屏 54 } 55 } 56 } 57 58 int file()//文件的读取 59 { 60 int i,n; 61 FILE *fp; 62 fp=fopen("cmd.txt","r+"); 63 for(i=0;!feof(fp);i++) 64 { 65 fscanf(fp,"%s%s%s%d",os[i].command,os[i].commandstate,os[i].YON_parameter,&os[i].a); 66 n=i; 67 } 68 fclose(fp); 69 return n; 70 } 71 main() 72 { 73 int n; 74 char str[N]; 75 printf("Microsoft Windows [版本 6.1.7601 ]\n"); 76 printf("版本所有 2009 Microsoft Corporation。保留所有权利\n\n "); 77 n=file(); 78 while(1){ 79 printf("C:\\Users\\Administrator.USER-20151120JI>"); 80 gets(str); 81 judge(str,n); 82 command_function(str,n); 83 printf("\n"); 84 } 85 }