实验一 命令解释程序的编写

实验一  命令解释程序的编写

   专业:商软一班      学号:201406114101     姓名:丘娟      

一、实验目的

(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.源程序名:压缩包文件(rarzip)中源程序名MiniOS.c

可执行程序名:MiniOS.exe

2.原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

3.主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h>
#define Max 500
struct Cmd{
    char cmd[30];  //命令名
    char function[500];  //命令功能
    int post;  //是否是内部命令,是则为1否则为0
    int cs; //运行是否需要参数
    char parameter[1000];  //参数
};
int count=0;
void Init(struct Cmd cm[Max])
{
    FILE *fp;
    if((fp=fopen("cmd.txt","a+"))==NULL) //a+ 以附加方式打开可读写的文件
    {
        printf("File open error!\n");
        exit(0);
    }
    while(!feof(fp)&&fgetc(fp)!=EOF)
    {
        fseek(fp,-1L,SEEK_CUR);
        fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post);
        count++;
    }
    if(fclose(fp))
    {
        printf("Can not close the file!\n");
        exit(0);
    }
}
void display(struct Cmd cm[Max])
{
    for(int i=0;i<count;i++)
    {
        printf("%-10s%s\n",strupr(cm[i].cmd),cm[i].function);  //strupr()将字符串转换为大写
        strlwr(cm[i].cmd);  //strlwr()将字符串转换为小写
    }
}
void process(struct Cmd cm[Max])   //处理
{
    char str[10];
    printf("Microsoft Windows [版本 10.0.10586]\n");
    printf("(c) 2016 Microsoft Corporation.保留所有权利.\n");
    while(strcmp(str,"quit")!=0){
        printf("\nC:\\Documents and Settings\\hskd>");
        scanf("%s",str);   //输入字符串
        strlwr(str);    //strlwr()将字符串转换为小写
        bool flag=false;
        if(strcmp(str,"help")==0)
        {
            printf("有关某个命令的详细信息,请键入 HELP 命令名\n");
            display(cm);   //调用函数
            flag=true;
        }else{
            for(int i=0;i<count;i++)
            {
                if(strcmp(str,cm[i].cmd)==0)    //比较输入的字符串是否等于记事本里面的命令名
                {
                    if(cm[i].post==1)
                    {
                        if(cm[i].cs==1)
                        {
                            printf("'%s'是内部命令\n该命令作用是:%s\n该命令运行需要参数\n",str,cm[i].function);
                            printf("参数是:%s\n",&cm[i].parameter);
                        }else
                            printf("'%s'是内部命令\n该命令作用是:%s\n该命令运行不需要参数\n",str,cm[i].function);
                    }
                    else
                    {
                        if(cm[i].cs==1)
                        {
                            printf("'%s'是外部命令\n该命令作用是:%s\n该命令运行需要参数\n",str,cm[i].function);
                            printf("参数是:%s\n",&cm[i].parameter);
                        }else
                            printf("'%s'是外部命令\n该命令作用是:%s\n该命令运行不需要参数\n",str,cm[i].function);
                    }
                    flag=true;
                    break;
                }
            }
            if(!flag){    //如果输入的字符串既不是help,也不是记事本里面的命令
                if(strcmp(str,"quit")!=0)
                    printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。\n",str);
            }
        }
    }
    printf("\n程序结束!\n\n");
}
int main()
{
    struct Cmd cm[Max];
    Init(cm);
    process(cm);
    return 0;
}

4.运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

 

 

 

四、实验总结

有很多知识都忘记了,有些要找资料和问同学才能解决。

 

 

posted @ 2016-03-25 14:57  01丘娟  阅读(438)  评论(0编辑  收藏  举报