• 实验一(操作系统)


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

        一、目的和要求

              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. 命令解释程序的原理:

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

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

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

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

                  2)另一种是由专门的“系统程序” 实现,自身不含命令处理代码,也不进行处理,仅仅把这条命令对应的命令文件装入内存执行。

                  例如:在DOS操作系统中,dir、cd、cls等命令的执行代码包含在系统自身内核中,称为内部命令;format、help等命令的执行代码在外部文件中,称为外部命令。

          实验拓展

            1) *如何真正实现dir、cls等DOS内部命令的功能?

            2)**如何真正实现format、help等DOS外部命令的功能?

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <windows.h> 
    #define Max 500
    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)
        {
            printf("File open error!
    ");
            exit(0);
        }
        while(!feof(fp)&&fgetc(fp)!=EOF)
        {
            fseek(fp,-1L,SEEK_CUR);
            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 key[10];
        printf("Microsoft Windows XP [版本 5.1.2600]
    ");
        printf("<C> 版权所有 1985-2001 Microsoft Corp.
    
    ");
        while(strcmp("exit",key))
        {
            printf("C:\Documents and Settings\Administrator>");
            scanf("%s",key);
            strlwr(key);
            bool flag=false;
            if(strcmp(key,"help")==0)
            {
                printf("有关某个命令的详细信息,请键入HELP命令名
    ");
                display(cm);
                flag=true;
            }else{
                for(int i=0;i<count;i++)
                {
                    if(strcmp(key,cm[i].cmd)==0)
                    {
                        if(cm[i].post==1)
                            printf("'%s'内部命令输入正确!
    该命令作用是:%s
    ",key,cm[i].function);
                        else
                            printf("'%s'外部命令输入正确!
    该命令作用是:%s
    ",key,cm[i].function);
                        system(key);//新加了系统的调用cmd去处理该命令
                        flag=true;
                        break;
                    }
                }
                if(!flag){
                    if(strcmp(key,"quit")!=0)
                        printf("'%s'不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    ",key);
                }
            }
        }
        printf("
    程序结束!
    
    ");
    }
    int main()
    {
        struct Cmd cm[Max];
        Init(cm);
        process(cm);
        return 0;
        
    }

  • 相关阅读:
    找零钱「Usaco2006 Dec」
    才艺表演「Usaco2018 Open」
    潜入行动「JSOI2018」
    任务安排「SDOI2012」
    BZOJ2298: [HAOI2011]problem a
    JZOJ 5818
    JZOJ 3493
    JZOJ 3470
    JZOJ 5781
    JZOJ 5778
  • 原文地址:https://www.cnblogs.com/LwF39/p/5319552.html
Copyright © 2020-2023  润新知