实验一、命令解释程序的编写实验
专业:商业软件工程 姓名:蓝叶 学号:201406114201
一、实验目的
(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.主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define n 100 typedef struct node{ char name[20]; char use[100]; int pro; int ten; }DOS; int count=0; //读取文件 void ReadField(DOS dos[]) { FILE *fp; if((fp=fopen("cmd.txt","a+"))==NULL) { printf("File open error!\n"); exit(0); } while(!feof(fp)&&fgetc(fp)!=EOF) { fseek(fp,-1L,SEEK_CUR); fscanf(fp,"%s%s%d%d",&dos[count].name,&dos[count].use,&dos[count].pro,&dos[count].ten); count++; } if(fclose(fp)) { printf("Can not close the file!\n"); exit(0); } } //help显示功能 void display(DOS dos[]) { int i; for(i=0;i<count;i++) printf("%s\t%s\n",dos[i].name,dos[i].use); } void Choose(DOS dos[]) { int i; char str[11]; bool flag=false; while(1) { printf("C:\\Documents and Settings\\hskd>"); gets(str); strupr(str); //小写转换成大写 if(strcmp(str,"HELP")==0) { printf("有关某个命令的详细信息,请输入 HELP 命令名\n"); display(dos); flag=true; printf("\n有关工具的详细信息,请参阅联机帮助中的命令行参考。\n\n"); } else if(strcmp(str,"QUIT")==0) exit(0); else if(strcmp(str,"CLS")==0) system("cls"); //引用系统cls功能进行清屏 else { for(i=0;i<12;i++) { if(strcmp(str,dos[i].name)==0) { if(dos[i].pro==1) { if(dos[i].ten==1) printf("'%s' 内部命令输入正确!\n该命令的作用是:%s\n该命令运行需要参数支持\n\n",str,dos[i].use); else printf("'%s' 内部命令输入正确!\n该命令的作用是:%s\n该命令运行并不需要参数支持\n\n",str,dos[i].use); } else { if(dos[i].ten==1) printf("'%s' 外部命令输入正确!\n该命令的作用是:%s\n该命令运行需要参数支持\n\n",str,dos[i].use); else printf("'%s' 外部命令输入正确!\n该命令的作用是:%s\n该命令运行并不需要参数支持\n\n",str,dos[i].use); } flag=true; } } if(!flag) { if(strcmp(str,"quit")!=0) { strlwr(str); //大写转换成小写 printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件\n\n",str); } } } } } main() { DOS dos[n]; printf("Microsoft Window XP [版本 5.1.2600]\n"); printf("<C> 版权所有 1985-2001 Microsoft Corp.\n\n"); ReadField(dos); Choose(dos); }
4.运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
三、实验总结
添加了参数标记来判断这个命令是否需要参数
实现了cls清屏功能:system("cls");
quit退出功能:exit(0);
help功能
实现了大小写之间的转换:大写转换成小写:strlwr(str)
小写转换成大写:strupr(str)