03-25实验一、命令解释程序的编写
实验一、命令解释程序的编写
专业:商软二班 姓名:颜文生 学号:201406114256
一、 实验目的
(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或zip)中源程序名×××.c
可执行程序名:×××.exe
- 2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
- 3. 主要程序段及其解释:
//自行定义系统提示符
void Define(CMD c[20])
{
int i=0;
char *name[11]={"dir","cd","md","rd","cls","date","time","ren","cope","help","quit"};
char *type[11]={"内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","外部命令","外部命令"};
char *func[11]={"显示一个目录中的文件和子目录","显示当前目录的名称或将其更改","创建一个目录","删除目录","清除屏幕","显示或设置日期",
"内部命令显示或设置系统时间","重新命名文件","将至少一个文件复制到另一个位置","提供Windows命令的帮助信息","退出命令解释程序"};
//将已定义好的提示符依次赋值给数组c
for(i=0;i<11;i++)
{
strcpy(c[i].command_name,name[i]);
strcpy(c[i].command_type,type[i]);
strcpy(c[i].command_func,func[i]);
}
}
//从键盘输入命令提示符,并输出相关结果
void Input(CMD c[20])
{
char name[20];
int i;
while(1)
{
printf("C:\\Documents and Settings\\Administrator>");
gets(name);
//若输入help或HELP,则输出全部提示符信息
if(strcmp("HELP",name)==0 || strcmp("help",name)==0)
{
for(i=0;i<11;i++)
{
printf("%s",c[i].command_name);
putchar('\t');
printf("%s",c[i].command_type);
putchar('\t');
printf("%s",c[i].command_func);
putchar('\n');
}
putchar('\n');
}
//若输入quit,则退出程序
else if(strcmp("quit",name)==0)
{
return;
}
else
{
for(i=0;i<11;i++)
{
if(strcmp(c[i].command_name,name)==0)
{
printf("%s",c[i].command_name);
putchar('\t');
printf("%s",c[i].command_type);
putchar('\t');
printf("%s",c[i].command_func);
putchar('\n');
putchar('\n');
break;
}
}
//若没有输入自定义的提示符,则给出相关提示
if(i>=11)
{
printf("'%s'不是内部或外部命令,也不是可运行的程序或批处理文件\n\n",name);
}
}
}
}
- 4. 运行结果及分析
四、 实验总结
难点:没有具体完成命令提示符的现实功能。以及没有其他命令提示符的主要功能介绍,如ASSOC,CALL等。
自身程序缺点:简单地完成各个命令提示符的相关介绍,并没有像系统提供的那样全面。不过这让我了解了程序运行原理。
源代码:
#include<stdio.h> #include<string.h> struct cmd { char command_name[10]; //提示符名字 char command_type[10]; //提示符命令类型 char command_func[100]; //提示符功能 }; typedef struct cmd CMD; void Head(); void Define(CMD c[20]); void Input(CMD c[20]); main() { CMD c[20]; Head(); Define(c); Input(c); } //设置控制台头部 void Head() { printf("Microsoft Windows XP [版本 5.1.2600]\n"); printf("(C) 版权所有 1985-2001 Microsoft Corp.\n\n"); } //自行定义系统提示符 void Define(CMD c[20]) { int i=0; char *name[11]={"dir","cd","md","rd","cls","date","time","ren","cope","help","quit"}; char *type[11]={"内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","内部命令","外部命令","外部命令"}; char *func[11]={"显示一个目录中的文件和子目录","显示当前目录的名称或将其更改","创建一个目录","删除目录","清除屏幕","显示或设置日期", "内部命令显示或设置系统时间","重新命名文件","将至少一个文件复制到另一个位置","提供Windows命令的帮助信息","退出命令解释程序"}; //将已定义好的提示符依次赋值给数组c for(i=0;i<11;i++) { strcpy(c[i].command_name,name[i]); strcpy(c[i].command_type,type[i]); strcpy(c[i].command_func,func[i]); } } //从键盘输入命令提示符,并输出相关结果 void Input(CMD c[20]) { char name[20]; int i; while(1) { printf("C:\\Documents and Settings\\Administrator>"); gets(name); //若输入help或HELP,则输出全部提示符信息 if(strcmp("HELP",name)==0 || strcmp("help",name)==0) { for(i=0;i<11;i++) { printf("%s",c[i].command_name); putchar('\t'); printf("%s",c[i].command_type); putchar('\t'); printf("%s",c[i].command_func); putchar('\n'); } putchar('\n'); } //若输入quit,则退出程序 else if(strcmp("quit",name)==0) { return; } else { for(i=0;i<11;i++) { if(strcmp(c[i].command_name,name)==0) { printf("%s",c[i].command_name); putchar('\t'); printf("%s",c[i].command_type); putchar('\t'); printf("%s",c[i].command_func); putchar('\n'); putchar('\n'); break; } } //若没有输入自定义的提示符,则给出相关提示 if(i>=11) { printf("'%s'不是内部或外部命令,也不是可运行的程序或批处理文件\n\n",name); } } } }