zoukankan      html  css  js  c++  java
  • 实验一 : 命令解释程序的编写

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

    一、目的和要求

    1. 实验目的

    (1)掌握命令解释程序的原理;

    (2)掌握简单的DOS调用方法;

    (3)掌握C语言编程初步。

    2.实验要求

    编写类似于DOS,UNIX的命令行解释程序

    (1)自行定义系统提示符

    (2)自定义命令集(8-10个)

    (3)用户输入HELP以查找命令的帮助

    (4)列出命令的功能,区分内部还是外部命令

    (5)用户输入QUIT退出

    (6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。

    二、实验内容

    根据教师指定的实验课题,完成设计、编码、测试工作。

    、实验环境

    1.PC微机

    2.Windows 操作系统

    3.C/C++程序开发集成环境

    四、实验原理及核心算法参考程序段

    命令解释程序的主要功能是:

      1.实现功能:

        简单的实现了cmd的功能,如dir,time,help等等。

      2.参考结果图:

          

          

      3.程序代码:

    #include<stdio.h>//stdio 就是指 “standard input & output"(标准输入输出)
                    //所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!
                    //例如c语言中的 printf("%d",i); scanf("%d",&i);等函数
    #include<string.h>//在使用到字符数组时需要使用
    #include<stdlib.h>
    #define Max 500
    /*自定义结构体
    *    cmd   命令名
    *    function   命令功能
    *    post  用1和0标识,是内部指令,还是外部指令
    */
    struct Cmd{
        char cmd[30];
        char function[500];
        int post;
    };
    
    int count=0;
    
    /*文件读取操作
    */
    void Init(struct Cmd cm[Max])
    {
        FILE *fp;
        if((fp=fopen("cmd.txt","a+"))==NULL)  //fopen函数用于获取一个文件指针   a+:    打开或新建一个文本文件,可以读,但只允许在文件末尾追写
        {
            printf("File open error!
    ");
            exit(0);
        }
        //fgetc()这个函数是返回读取的一个字节。如果读到文件末尾返回EOF,EOF是一个宏,它的值等于-1
        //feof()输入输出函数,检查文件是否结束,如结束,则返回非零值,否则返回0 
        while(!feof(fp)&&fgetc(fp)!=EOF)    
        {    
            /*重定位流(数据流/文件)上的文件内部位置指针
          *注意:不是定位文件指针,文件指针指向文件/流。
            *位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。
            *第一个参数stream为文件指针
             *第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
          *第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
          *SEEK_SET: 文件开头
          *SEEK_CUR: 当前位置
          *SEEK_END: 文件结尾
          *其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
            */
            fseek(fp,-1L,SEEK_CUR);
            //对文件内容的读取,并将读取的内容存入链表Cmd中
            fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post);
            count++;
        }
        if(fclose(fp))//关闭文件指针
        {
            printf("Can not close the file!
    ");
            exit(0);
        }
    }
    
    /*输出从文件读取的所有内容
    */
    void display(struct Cmd cm[Max])
    {
        for(int i=0;i<count;i++)
        {
            printf("%-10s%s
    ",strupr(cm[i].cmd),cm[i].function);
            strlwr(cm[i].cmd);
        }
    }
    /*对用户输入的字符串进行识别和查找
    */
    void process(struct Cmd cm[Max])
    {
        char str[10];
    
        while(strcmp(str,"quit")!=0){   //判断用户输入命令是不是quit
            system("cls");
            printf("Microsoft Windows XP [版本 5.1.2600]
    ");      
            printf("(C) 版权所有 1985-2001 Microsoft Corp.
    ");
            printf("
    学号:201406114116 :\>");
            //scanf("%s",str);
            gets(str);
            fflush(stdin);//清除缓存区
            strlwr(str);    //char *strlwr(char *a)功能:将字符串a转换为小写形式
                            //char *strupr(char *a)功能:把字符串a中的串转换成大写
            bool flag=false;
            if(strcmp(str,"help")==0)   //判断用户输入命令是不是help
            {
                system(str);
                //display(cm);
                flag=true;    //用于判断用户输入的字符串是否在cm中找得到的标识
            }else{
                for(int i=0;i<count;i++)
                {
                    if(strcmp(str,cm[i].cmd)==0)    //把用户输入的字符串 在数组cm中查找,找到并输出
                    {
                        if(cm[i].post==1){
                            printf("'%s' 内部命令输入正确!
    该命令作用是:%s
    ",str,cm[i].function);
                            system(str);
                        }else{
                            printf("'%s' 外部命令输入正确!
    该命令作用是:%s
    ",str,cm[i].function);
                            system(str);
                        }
                        flag=true;
                        break;
                    }
                    
                }
                if(!flag){    //当找不到执行下面语句
                    if(strcmp(str,"quit")!=0){
                        printf("'%s' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    ",str);
                        system(str);
                    }
                }
            }
            system("pause");
        }
        printf("
    程序结束!
    
    ");    //程序运行结束标志
    }
    int main()
    {
        struct Cmd cm[Max];
        system("title 黄敏鹏");//设置cmd窗口标题
        Init(cm);
        process(cm);
        return 0;
    }
  • 相关阅读:
    kaggle CTR预估
    基于大规模语料的新词发现算法【转自matix67】
    vim E437: terminal capability "cm" required
    makefile 中的符号替换($@、$^、$<、$?)
    【转】Makefile 中:= ?= += =的区别
    python urljoin问题
    python 写文件刷新缓存
    python Popen卡死问题
    nohup 日志切割
    换行和回车野史
  • 原文地址:https://www.cnblogs.com/huangmp1024/p/5319640.html
Copyright © 2011-2022 走看看