• 0325 实验一操作系统模拟cmd


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

    专业:商软(2)班   姓名:韩麒麟 学号:201406114253

    一、 实验目的

    (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.原理分析及流程图

              本次实验主要是把命令放到记事本里面,最后通过程序来读取文档,这样的做法主要是方便更改数据。在程序里建一个命令结构体,里面包含了命令名、命令功能、判断内部或外部命令的编号、参数,如 最后通过用户输入的字符串,比较是否与记事本里面的命令名一样,相同则输出该命令的所有信息,若不同则输出该命令不是内部命令或外部命令。如果用户输入exit,则程序结束。 

      3.主要程序段及其解释

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    typedef struct node
    {
        char order[9];
        char exp[35];
        struct node *next;
    }ORDER;
    int saveflag = 0;
    
    void InputInfo(ORDER *head)
    {
        ORDER *p,*r,*s;
        int i;
        char ord[15];
        s=head;
        while(s->next!=NULL)             
            s=s->next;
        while(1)
        {
    BB:
        r=head->next;
    
            printf("
    
    
    请输入命令:(0为退出)");
            scanf(" %s",ord);
            if(strcmp(ord,"0")==0)
              break;
            
            while(r!=NULL)
            {
                if(strcmp(r->order,ord)==0)             
                {
                        printf("
    信息已存在,输入无效,请重新输入:");
                        goto BB;
                }
                r=r->next;
            }
            p=(ORDER*)malloc(sizeof(ORDER));
            strcpy(p->order,ord);                                 
            printf("请输入解释:
    ");
            scanf("%s",p->exp);
            p->next=NULL; 
            s->next=p;
            s=p;
            saveflag=1;
            
        }
    }
    
    void Open(){
        char order[20];
        char c[3000];
        int i;    
        FILE *p1=fopen("MiniOS.txt","r");
        if(!p1)
            printf("打开失败
    ");    
    
                for(i=0;i<2686;i++)
                {
                    fscanf(p1,"%c",&c[i]);
                    printf("%c",c[i]);
                }
                fclose(p1);
                printf("
    
    ");
             if(strcmp(order,"exit")==0){
                return 0;
            }
        }
    
    
    void Save(ORDER *l)
    {
        FILE *f;
        ORDER *p;
        int count=0,flag=1;
        f=fopen("cmd_1.txt","wb");
            if(f==NULL)
            {
                printf("the file can't be opened!");
                return ;
            }
            p=l->next;
            while(p->next != NULL)
            {
                if(fwrite(p,sizeof(ORDER),1,f)==1)
                {
                    p=p->next;
                    count++;
                }
                else
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            {
                printf("
    保存
    ");
                saveflag=0;
            }
       fclose(f);
    }
    
    void main()
    {
        ORDER *osOrder,*head,*p,*z;       //系统的命令集合,和解析。
        char user[10],ch1;           //用户的输入。
        int i;
        FILE *fp1;
        head = (ORDER*)malloc(sizeof(ORDER));
        head->next =NULL;
        z = head;
        
        if((fp1 = fopen("cmd_1.txt", "ab+")) == NULL)
        {                                            
            printf("cmd_1.txt is NULL!!!");    
            return;
        }
        printf("Microsoft Windows XP [版本 5.1.2600]
    ");
        printf("(C) 版权所有 1985-2001 Microsoft Corp.
    
    ");
        for(i = 0 ; !feof(fp1) ; i++)
        {
            p=(ORDER*)malloc(sizeof(ORDER));
            if(fread(p,sizeof(ORDER),1,fp1) == 1)
            {
                
                p->next=NULL ;
                z->next=p;
                z=p;    
            }    
        }
        fclose(fp1);
    
        p = head->next;
    
        while(1)
        {
        
            printf("C:\Users\Administrator>");
            scanf("%s",&user);
            
            if(strcmp(user,"exit") == 0)
            {
                if(saveflag==1)                                          
                {
                    getchar();
                    printf("
    文档信息发生改变,是否进行保存(y/n)?
    ");
                    scanf("%c",&ch1);
                    if(ch1=='y' || ch1=='Y')
                    {
                        Save(head);
                        printf("
    保存成功!
    ");
                    }
                }        
                exit(0);
            }
            else if(strcmp(user,"editor") == 0)
            {
                InputInfo(head);
                
            }
            else if(strcmp(user,"help") == 0)
            {
                Open();
                /*    p = head->next;
                while(p != NULL)
                {
                    printf("%-9s%s
    ",p->order,p->exp);
                    p = p->next;
                }*/
    
            }
            else if(strcmp(user,"
    ")==0)
            {
                system("dir");
            }
    
            else
            {
                p = head->next;
                while(p != NULL)
                {
                    if(strcmp(user,p->order) == 0)
                    {
                        
                        printf("内部命令!
    ");
                        printf("作用为:");
                        printf("%s
    
    ",p->exp);
                    }
                        p=p->next;
                }
            }
        }
    }


  • 相关阅读:
    Tomatocart中文语言如何安装
    PHP中文乱码
    MySQL性能优化的最佳20+条经验
    linux内核文件IO的系统调用实现分析(open)
    委员联名提案停止评选三好学生 网友评论超2000
    jquery实现增加删除行
    centos 6 挂载 NTFS 分区
    linux 下的PC-lint----splint
    Linux测试软件:从源代码开始
    在Redhat中搭建linux-0.11运行环境
  • 原文地址:https://www.cnblogs.com/hanqilin/p/5319012.html
Copyright © 2020-2023  润新知