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("\n\n\n请输入命令:(0为退出)");
        scanf(" %s",ord);
        if(strcmp(ord,"0")==0)
          break;
        
        while(r!=NULL)
        {
            if(strcmp(r->order,ord)==0)             
            {
                    printf("\n信息已存在,输入无效,请重新输入:");
                    goto BB;
            }
            r=r->next;
        }
        p=(ORDER*)malloc(sizeof(ORDER));
        strcpy(p->order,ord);                                 
        printf("请输入解释:\n");
        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("打开失败\n");    

            for(i=0;i<2686;i++)
            {
                fscanf(p1,"%c",&c[i]);
                printf("%c",c[i]);
            }
            fclose(p1);
            printf("\n\n");
         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("\n保存\n");
            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]\n");
    printf("(C) 版权所有 1985-2001 Microsoft Corp.\n\n");
    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("\n文档信息发生改变,是否进行保存(y/n)?\n");
                scanf("%c",&ch1);
                if(ch1=='y' || ch1=='Y')
                {
                    Save(head);
                    printf("\n保存成功!\n");
                }
            }        
            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\n",p->order,p->exp);
                p = p->next;
            }*/

        }
        else if(strcmp(user,"\n")==0)
        {
            system("dir");
        }

        else
        {
            p = head->next;
            while(p != NULL)
            {
                if(strcmp(user,p->order) == 0)
                {
                    
                    printf("内部命令!\n");
                    printf("作用为:");
                    printf("%s\n\n",p->exp);
                }
                    p=p->next;
            }
        }
    }
}


 

posted @ 2016-03-25 12:48  53韩麒麟  阅读(457)  评论(0编辑  收藏  举报