天天看點

實驗一 指令解釋程式的編寫

實驗一  指令解釋程式的編寫

   專業:商軟一班      學号:201406114101     姓名:丘娟      

一、實驗目的

(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.源程式名:壓縮封包件(rar或zip)中源程式名MiniOS.c

可執行程式名:MiniOS.exe

2.原理分析及流程圖

主要總體設計問題。

(包括存儲結構,主要算法,關鍵函數的實作等)

3.主要程式段及其解釋:

實作主要功能的程式段,重要的是程式的注釋解釋。

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h>
#define Max 500
struct Cmd{
    char cmd[30];  //指令名
    char function[500];  //指令功能
    int post;  //是否是内部指令,是則為1否則為0
    int cs; //運作是否需要參數
    char parameter[1000];  //參數
};
int count=0;
void Init(struct Cmd cm[Max])
{
    FILE *fp;
    if((fp=fopen("cmd.txt","a+"))==NULL) //a+ 以附加方式打開可讀寫的檔案
    {
        printf("File open error!\n");
        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!\n");
        exit(0);
    }
}
void display(struct Cmd cm[Max])
{
    for(int i=0;i<count;i++)
    {
        printf("%-10s%s\n",strupr(cm[i].cmd),cm[i].function);  //strupr()将字元串轉換為大寫
        strlwr(cm[i].cmd);  //strlwr()将字元串轉換為小寫
    }
}
void process(struct Cmd cm[Max])   //處理
{
    char str[10];
    printf("Microsoft Windows [版本 10.0.10586]\n");
    printf("(c) 2016 Microsoft Corporation.保留所有權利.\n");
    while(strcmp(str,"quit")!=0){
        printf("\nC:\\Documents and Settings\\hskd>");
        scanf("%s",str);   //輸入字元串
        strlwr(str);    //strlwr()将字元串轉換為小寫
        bool flag=false;
        if(strcmp(str,"help")==0)
        {
            printf("有關某個指令的詳細資訊,請鍵入 HELP 指令名\n");
            display(cm);   //調用函數
            flag=true;
        }else{
            for(int i=0;i<count;i++)
            {
                if(strcmp(str,cm[i].cmd)==0)    //比較輸入的字元串是否等于記事本裡面的指令名
                {
                    if(cm[i].post==1)
                    {
                        if(cm[i].cs==1)
                        {
                            printf("'%s'是内部指令\n該指令作用是:%s\n該指令運作需要參數\n",str,cm[i].function);
                            printf("參數是:%s\n",&cm[i].parameter);
                        }else
                            printf("'%s'是内部指令\n該指令作用是:%s\n該指令運作不需要參數\n",str,cm[i].function);
                    }
                    else
                    {
                        if(cm[i].cs==1)
                        {
                            printf("'%s'是外部指令\n該指令作用是:%s\n該指令運作需要參數\n",str,cm[i].function);
                            printf("參數是:%s\n",&cm[i].parameter);
                        }else
                            printf("'%s'是外部指令\n該指令作用是:%s\n該指令運作不需要參數\n",str,cm[i].function);
                    }
                    flag=true;
                    break;
                }
            }
            if(!flag){    //如果輸入的字元串既不是help,也不是記事本裡面的指令
                if(strcmp(str,"quit")!=0)
                    printf("'%s' 不是内部或外部指令,也不是可運作的程式\n或批處理檔案。\n",str);
            }
        }
    }
    printf("\n程式結束!\n\n");
}
int main()
{
    struct Cmd cm[Max];
    Init(cm);
    process(cm);
    return 0;
}      

4.運作結果及分析

一般必須配運作結果截圖,結果是否符合預期及其分析。

   (截圖需根據實際,截取有代表性的測試例子)

實驗一 指令解釋程式的編寫
實驗一 指令解釋程式的編寫

四、實驗總結

有很多知識都忘記了,有些要找資料和問同學才能解決。