• 实验一 MiniOS


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

    商软1班   杨晶晶  201406114102

    一、        实验目的

    (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.c

    可执行程序名:MiniOS.exe

    2.      原理分析及流程图

    1. 命令解释程序的原理:

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

    接受和执行一条用户从键盘输入的命令,它通常保存一张命令名字(动词)表,其中记录着所有操作命令及其处理程序的入口地址或有关信息。

    2. 命令解释程序实现的两种方式 :

    1) 一种是它自身包含了命令的执行代码;

    2) 另一种是由专门的“系统程序” 实现,自身不含命令处理代码,也不进行处理,仅仅把这条命令对应的命令文件装入内存执行。例如:在DOS操作系统中,dir、cd、cls等命令的执行代码包含在系统自身内核中,称为内部命令;format、help等命令的执行代码在外部文件中,称为外部命令。

    3. 编程实现流程

    显示程序提示信息;

    While(1)

    { 显示提示符;

    接收键盘的字符串;

    判断是否quit程序退出指令,是则退出;

    判断是否内部命令,并给出相应的信息,否则给出错误信息;

    显示退出程序信息;

    首先查了cmd有哪些命令指示符,分别有什么作用,在自己电脑的cmd输入一些字符看对应的结果。通过在自己电脑输入命令指示符复制到程序的显示输出中,使得用起来像真的一样。

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

     1 #include<stdio.h> 
     2 #include<string.h> //在使用到字符数组时需要使用
     3 #include<stdlib.h>
     4 void main() 
     5 {  
     6     int system(const char *string);
     7     //定义数组中的值
     8     char cmd[20][20]={"dir","cd","md","rd","cls","date","time","ren","copy","help","quit"};  
     9     char str[20];
    10     //Init(str);
    11     printf("Microsoft Windows [版本 10.0.10240]
    ");//设置标题
    12     printf("(C) 2015 Microsoft Corporation. All rights reserved.
    ");
    13     while(1)//进入函数循环
    14     {
    15         printf("
    C:\Users\yj>");
    16         gets(str);
    17         int i,date;
    18         for(i=0; '' != str[i]; i++)//for循环遍历s串
    19         {  
    20             if(str[i] >= 'A' && str[i] <= 'Z') //判断是不是大写字母
    21                 str[i] += 32;  //转换成小写
    22         }
    23         if(strcmp(str,cmd[0])==0)//判断输入单词是否与cmd数组中的对应
    24         {            
    25             //system(str);
    26             printf("dir     内部命令:显示一个目录中的文件和子目录
    ");
    27             printf("
    驱动器 C 中的卷是 系统
    卷的序列号是 0E33-63F0
    
    C:Usersyj 的目录
    
    2016/03/19  15:47    <DIR>         .
    2016/03/10  16:28    <DIR>          Music
    2016/03/12  17:20    <DIR>          OneDrive
    2016/03/10  16:28    <DIR>          Pictures
    2016/03/10  16:28    <DIR>          Saved Games
    2016/03/10  16:28    <DIR>          Searches
    2016/03/10  16:28    <DIR>          Videos
                  4 个文件          2,159 字节
                 19 个目录 33,779,773,440 可用字节
    ");
    28         }
    29         else if(strcmp(str,cmd[1])==0)
    30         {
    31             printf("C:\Users\yj
    ");
    32             printf("cd     内部命令:显示当前目录的名称或将其更改
    ");
    33         }
    34         else if(strcmp(str,cmd[2])==0)
    35         {
    36             system("md");
    37             printf("md     内部命令:建立一个目录或文件夹.dos下面习惯叫目录,win下面习惯叫文件夹
    ");
    38         }
    39         else if(strcmp(str,cmd[3])==0)
    40         {
    41             system("rd");
    42             printf("rd     内部命令:删除目录
    ");
    43         }
    44         else if(strcmp(str,cmd[4])==0)
    45         {
    46             system("cls");
    47             printf("cls     内部命令:清除屏幕
    ");
    48         }
    49         else if(strcmp(str,cmd[5])==0)
    50         {
    51             printf("date     内部命令:显示或设置日期
    ");
    52             printf("当前日期: 2016/03/24 周四
    输入新日期: (年月日):
    ");        
    53         }
    54         else if(strcmp(str,cmd[6])==0) 
    55         {
    56             printf("当前时间: 21:45:07.86
    ");
    57             printf("time     内部命令:显示或设置系统时间
    ");
    58         }
    59         else if(strcmp(str,cmd[7])==0)
    60         { 
    61             printf("ren     内部命令:重新命名文件,ren命令的格式是:ren 源文件名目的文件名
    ");
    62         }
    63         else if(strcmp(str,cmd[8])==0)
    64         {
    65             printf("copy     内部命令:将至少一个文件复制到另一个位置
    ");
    66         }
    67         else if(strcmp(str,cmd[9])==0)
    68         {
    69             printf("dir    显示一个目录中的文件和子目录
    ");
    70             printf("cd     显示当前目录的名称或将其更改
    ");
    71             printf("md     建立一个目录或文件夹.dos下面习惯叫目录,win下面习惯叫文件夹
    ");
    72             printf("rd     删除目录
    ");
    73             printf("cls    清除屏幕
    ");
    74             printf("date   显示或设置日期
    ");
    75             printf("time   显示或设置系统时间
    ");
    76             printf("ren    重新命名文件,ren命令的格式是:ren 源文件名目的文件名
    ");
    77             printf("copy   将至少一个文件复制到另一个位置
    ");
    78             printf("help   提供Windows命令的帮助信息
    ");
    79             printf("quit   退出命令解释程序
    ");
    80             printf("
    有关工具的详细信息,请参阅联机帮助中的命令行参考。
    ");
    81         }
    82         else if(strcmp(str,cmd[10])==0)
    83             return;
    84             else
    85         {
    86             printf("'%s' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    ",str);
    87         }
    88     }
    89 }

     4.      运行结果及分析

    四、        实验总结

    一开始觉得这个没什么,听老师说还以为挺简单的,就让用户输入命令符然后输出对应的文字就行啦,可是打代码才发现自己会漏了很多细节的地方,比如要考虑输入是否区分大小写、能否让自己做的也实现真的cmd的功能。因为能力有限,只能做比较简单的内容,实现显示处理命令符的内容是在cmd打相应的命令符把对应的内容复制过去,也尝试了用system(str)的方法直接调用。看了老师的代码发现用读取文档的方式修改会比较方便,而且看起来比较整洁,用结构体的方法更好存放数据,要多学习。   

     

     

     

     

     

     

  • 相关阅读:
    [解题报告]256 Quirksome Squares
    [解题报告]369 Combinations
    [解题报告]10696 f91
    [解题报告]483 Word Scramble
    [解题报告]10041 Vito's Family
    [解题报告]686 Goldbach's Conjecture (II)
    [解题报告]151 Power Crisis
    [解题报告]10079 Pizza Cutting
    [解题报告]495 Fibonacci Freeze
    [解题报告]541 Error Correction
  • 原文地址:https://www.cnblogs.com/jjy520/p/5318519.html
Copyright © 2020-2023  润新知