zoukankan      html  css  js  c++  java
  • 操作系统模仿CMD

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

    专业:商软(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] != '' ; 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 命令名
    ");
     78             p = head->next;
     79             while(p != NULL)
     80             {
     81 
     82                 printf("%-9s%s
    ",p->order,p->exp);
     83                 p = p->next;
     84             }
     85             flag = 1;
     86             printf("
    ");
     87         }
     88         else if((strcmp(user,"
    ") == 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’内部命令输入正确!
    ",p->order);
    104                         printf("作用是:%s
    
    ",p->exp);
    105                     }
    106                     else if(p->post == 0 && p->arg == 0)
    107                     {
    108                         printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。
    ",p->order);
    109                     }
    110                     else
    111                     {
    112                         printf("命令语法不正确。没有参数!!!
    ");
    113                     }
    114                     flag = 1;
    115 
    116                 }
    117                     p=p->next;
    118             }
    119         }
    120         if(flag == 0)
    121         {
    122             printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。
    ",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]
    ");
    138     printf("(C) 版权所有 1985-2001 Microsoft Corp.
    
    ");
    139 
    140     initInfo(head);
    141     discern(head);
    142 
    143 }

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

    四、        实验总结

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

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

  • 相关阅读:
    【uiautomator】Interfaces+Exception
    【uiautomator】UiDevice
    【uiautomator】Uiautomator API
    【uiautomator】运行命令
    [www.infoshare.cc]【uiautomator】输入中文(输入法安装+测试代码)
    MFC ,List使用
    VC控件DateTimePicker使用方法
    GitHub vs. Bitbucket 不只是功能不同
    免费的私人代码托管(bitbucket) 和 常用git指令
    修改android studio中的avd sdk路径、avd sdk找不到的解决方案
  • 原文地址:https://www.cnblogs.com/liezhihua/p/5308954.html
Copyright © 2011-2022 走看看