54列志华

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

专业:商软(2)班   姓名:列志华  学号:201406114254

一、        实验目的

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

                 可执行程序名:MiniOS.exe

        2.      原理分析及流程图

                  本次实验主要是把命令放到记事本里面,最后通过程序来读取文档,这样的做法主要是方便更改数据。

                  在程序里建一个命令结构体,里面包含了命令名、命令功能、判断内部或外部命令的编号、参数,如:

      

1 typedef struct node
2 {
3     char order[9];
4     char exp[35];
5     int post;
6     int arg;
7     struct node *next;
8 }ORDER;

 

                  最后通过用户输入的字符串,比较是否与记事本里面的命令名一样,相同则输出该命令的所有信息,

                  若不同则输出该命令不是内部命令或外部命令。如果用户输入exit,则程序结束。 

        3.      主要程序段及其解释

  1 /*  
  2   完成时间:  3.22     22:30 pm
  3   首次发表时间:3.22     22:53 pm
  4   修改时间:  3.24     22:09 pm
  5 */ 
  6 
  7 
  8 
  9 #include<stdio.h>
 10 #include<stdlib.h>
 11 #include<string.h>
 12 #include<cstdlib>
 13 
 14 typedef struct node
 15 {
 16     char order[9];
 17     char exp[35];
 18     int post;
 19     int arg;
 20     struct node *next;
 21 }ORDER;
 22 int saveflag = 0;
 23 
 24 void initInfo(ORDER *head)
 25 {
 26     ORDER *p,*z;
 27     FILE *fp1;
 28     int i;
 29     z = head;
 30     if((fp1 = fopen("cmd_1.txt", "a+")) == NULL)
 31     {                                            //打开命令文件
 32         printf("cmd_1.txt is NULL!!!");    
 33         return;
 34     }
 35 
 36     for(i = 0 ; !feof(fp1)&&fgetc(fp1)!=EOF ; i++)
 37     {
 38         p=(ORDER*)malloc(sizeof(ORDER));
 39         fseek(fp1,-1L,SEEK_CUR);
 40         fscanf(fp1,"%s%s%d%d",&p->order,&p->exp,&p->post,&p->arg);
 41         p->next=NULL ;
 42         z->next=p;/*构造链表*/
 43         z=p;
 44     }
 45     fclose(fp1);
 46 }
 47 
 48 //用于把大写字母转为小写字母
 49 char toDownCase(char ch)      
 50 {
 51     if(( 'A' <= ch) &&(ch <= 'Z'))
 52     {
 53         return (ch + 32);
 54     }
 55     return ch;
 56 }
 57 
 58 
 59 //对用户的输入进行识别。
 60 void discern(ORDER *head)
 61 {
 62     ORDER *p;
 63     char user[10];
 64     int i = 0,flag = 0;
 65     while(1)
 66     {
 67         printf("C:\\Users\\Administrator>");
 68         scanf("%s",&user);
 69         for(i=0 ; user[i] != '\0' ; i++)
 70             user[i] = toDownCase(user[i]);
 71         if(strcmp(user,"exit") == 0)
 72         {    flag = 1;
 73             exit(0);
 74         }
 75         else if(strcmp(user,"help") == 0)
 76         {            
 77             printf("有关某个命令的详细信息,请键入 HELP 命令名\n");
 78             p = head->next;
 79             while(p != NULL)
 80             {
 81 
 82                 printf("%-9s%s\n",p->order,p->exp);
 83                 p = p->next;
 84             }
 85             flag = 1;
 86             printf("\n");
 87         }
 88         else if((strcmp(user,"\n") == 0))
 89         {
 90             continue;
 91             flag = 1;
 92         }
 93         else
 94         {
 95             p = head->next;
 96             flag = 0;
 97             while(p != NULL)
 98             {
 99                 if(strcmp(user,p->order) == 0)
100                 {
101                     if(p->post == 1 && p->arg == 0)
102                     {
103                         printf("‘%s’内部命令输入正确!\n",p->order);
104                         printf("作用是:%s\n\n",p->exp);
105                     }
106                     else if(p->post == 0 && p->arg == 0)
107                     {
108                         printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",p->order);
109                     }
110                     else
111                     {
112                         printf("命令语法不正确。没有参数!!!\n");
113                     }
114                     flag = 1;
115 
116                 }
117                     p=p->next;
118             }
119         }
120         if(flag == 0)
121         {
122             printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",user);
123         }
124         
125     }
126 }
127 
128 
129 void main()
130 {
131     ORDER *head,*p,*z;       //系统的命令集合,和解析。
132     char user[10];           //用户的输入。
133 
134     head = (ORDER*)malloc(sizeof(ORDER));
135     head->next =NULL;
136 
137     printf("Microsoft Windows XP [版本 5.1.2600]\n");
138     printf("(C) 版权所有 1985-2001 Microsoft Corp.\n\n");
139 
140     initInfo(head);
141     discern(head);
142 
143 }

 

 

测试结果与预期结果一样。

四、        实验总结

              通过本次实验我进一步加深了对结构体和数组的了解,也学会了如何通过C语言读取记事本里面的数据内容。

              通过询问同学和上网搜索相关知识,最后还是成功地解决了问题。

 

posted on 2016-03-22 22:51  liezh  阅读(408)  评论(0编辑  收藏  举报