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

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


                            专业:商业软件工程 姓名:郑培轩 学号:201406114117


    一、 实验目的
    (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. 主要程序段及其解释:

      1 #include<stdio.h>//stdio 就是指 “standard input & output"(标准输入输出)
      2                 //所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!
      3                 //例如c语言中的 printf("%d",i); scanf("%d",&i);等函数
      4 #include<string.h>//在使用到字符数组时需要使用
      5 #include<stdlib.h>
      6 #define Max 500
      7 /*自定义结构体
      8 *    cmd   命令名
      9 *    function   命令功能
     10 *    post  用1和0标识,是内部指令,还是外部指令
     11 */
     12 struct Cmd{
     13     char cmd[30];
     14     char function[500];
     15     int post;
     16 };
     17 
     18 int count=0;
     19 
     20 /*文件读取操作
     21 */
     22 void Init(struct Cmd cm[Max])
     23 {
     24     FILE *fp;
     25     if((fp=fopen("cmd.txt","a+"))==NULL)  //fopen函数用于获取一个文件指针   a+:    打开或新建一个文本文件,可以读,但只允许在文件末尾追写
     26     {
     27         printf("File open error!
    ");
     28         exit(0);
     29     }
     30     //fgetc()这个函数是返回读取的一个字节。如果读到文件末尾返回EOF,EOF是一个宏,它的值等于-1
     31     //feof()输入输出函数,检查文件是否结束,如结束,则返回非零值,否则返回0 
     32     while(!feof(fp)&&fgetc(fp)!=EOF)    
     33     {    
     34         /*重定位流(数据流/文件)上的文件内部位置指针
     35       *注意:不是定位文件指针,文件指针指向文件/流。
     36         *位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。
     37         *第一个参数stream为文件指针
     38          *第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
     39       *第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
     40       *SEEK_SET: 文件开头
     41       *SEEK_CUR: 当前位置
     42       *SEEK_END: 文件结尾
     43       *其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
     44         */
     45         fseek(fp,-1L,SEEK_CUR);
     46         //对文件内容的读取,并将读取的内容存入链表Cmd中
     47         fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post);
     48         count++;
     49     }
     50     if(fclose(fp))//关闭文件指针
     51     {
     52         printf("Can not close the file!
    ");
     53         exit(0);
     54     }
     55 }
     56 
     57 /*
     58  *    输出从文件读取的所有内容
     59  */
     60 void display(struct Cmd cm[Max])
     61 {
     62     for(int i=0;i<count;i++)
     63     {
     64         printf("%-10s%s
    ",strupr(cm[i].cmd),cm[i].function);
     65         strlwr(cm[i].cmd);
     66     }
     67 }
     68 /*
     69  *    对用户输入的字符串进行识别和查找
     70  */
     71 void process(struct Cmd cm[Max])
     72 {
     73     char str[10];
     74     printf("Microsoft Windows XP [版本 5.1.2600]
    ");      
     75     printf("(C) 版权所有 1985-2001 Microsoft Corp.
    ");
     76     while(strcmp(str,"quit")!=0){   //判断用户输入命令是不是quit
     77         printf("
    C:\Documents and Settings\hskd>");
     78         //scanf("%s",str);
     79         gets(str); 
     80         strlwr(str);    //char *strlwr(char *a)功能:将字符串a转换为小写形式
     81                         //char *strupr(char *a)功能:把字符串a中的串转换成大写
     82         bool flag=false;
     83         char dir[3]={'d','i','r'}; //作为判断标准
     84         if(strcmp(str,"help")==0)   //判断用户输入命令是不是help
     85         {
     86             printf("有关某个命令的详细信息,请键入 HELP 命令名
    ");
     87             display(cm);
     88             flag=true;    //用于判断用户输入的字符串是否在cm中找得到的标识
     89         }else{
     90             for(int i=0;i<count;i++)
     91             {
     92                 if(strcmp(str,cm[i].cmd)==0)    //把用户输入的字符串 在数组cm中查找,找到并输出
     93                 {
     94                     if(cm[i].post==1){
     95                         if(strcmp(str,dir))//如果字符串是dir
     96                             system(dir);//调用system命令执行dir命令
     97                         else
     98                             printf("'%s' 内部命令输入正确!
    该命令作用是:%s
    ",str,cm[i].function);
     99                     }else
    100                         printf("'%s' 外部命令输入正确!
    该命令作用是:%s
    ",str,cm[i].function);
    101                     flag=true;
    102                     break;
    103                 }
    104                 
    105             }
    106             if(!flag){    //当找不到执行下面语句
    107                 if(strcmp(str,"quit")!=0)
    108                     printf("'%s' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    ",str);
    109             }
    110         }
    111     }
    112     printf("
    程序结束!
    
    ");    //程序运行结束标志
    113 }
    114 int main()
    115 {
    116     struct Cmd cm[Max];
    117     Init(cm);
    118     process(cm);
    119     return 0;
    120 }

    2. 运行结果及分析

    四、 实验总结

    能够了解整个程序的运行过程以及其中的c语言代码,原来想通过findfirst和findnext(获得一个指定文件夹下面的所有文件的信息)来完成dir命令

    最后发现有难度,而且想到我们要的是通过这个程序来更好的了解操作系统,所以我就放弃了在这个小程序上使用这两个方法,但是课后会再去花时

    间研究一下。

  • 相关阅读:
    复权、前复权和后复权
    Android Fragment完全解析,关于碎片你所需知道的一切
    Android Volley完全解析(四),带你从源码的角度理解Volley
    Android Volley完全解析(三),定制自己的Request
    Android Volley完全解析(二),使用Volley加载网络图片
    Android Volley完全解析(一),初识Volley的基本用法
    利用HTML5开发Android笔记(下篇)
    利用HTML5开发Android笔记(中篇)
    利用HTML5开发Android笔记(上篇)
    Android经常使用开源组件汇总
  • 原文地址:https://www.cnblogs.com/peivxuan/p/5319639.html
Copyright © 2011-2022 走看看