天天看點

實驗一 指令解釋程式 實驗一、指令解釋程式實驗

 實驗一、指令解釋程式實驗

一、實驗目的

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

      可執行程式名:0311.exe

  1. 2.     原理分析及流程圖  

      用檔案讀寫的方式将指令及指令作用存入結構體數組

      指令解釋程式的原理:

        指令解釋程式的主要功能是:

          接受和執行一條使用者從鍵盤輸入的指令,它通常儲存一張指令名字(動詞)表,其中記錄着所有操作指令及其處理程式的入口位址或有關資訊。

        指令解釋程式實作的兩種方式 :

          一種是它自身包含了指令的執行代碼;

          另一種是由專門的“系統程式” 實作,自身不含指令處理代碼,也不進行處理,僅僅把這條指令對應的指令檔案裝入記憶體執行。

  1. 3.     主要程式段及其解釋:
#include <stdio.h>
#include <string.h>

struct
{
    char character[50];//指令字元
    char explain[200];//指令解釋
    int category;//指令分類 1-内部指令 0-外部指令
}typedef command;

int count = 0;
command cmd[30];

void Init()//讀取檔案
{        
    FILE *fp;
    if((fp=fopen("cmd.txt","a+"))!=NULL)
    {
        while(!feof(fp)&&fgetc(fp)!=EOF)
        {
            fseek(fp,-1L,SEEK_CUR);
            fscanf(fp,"%s%s%d",&cmd[count].character,&cmd[count].explain,&cmd[count].category);
            count++;
        }
    }else
        printf("fail to open");
    fclose(fp);

}
void Title()//列印标題
{
    printf("Microsoft Windows [版本 10.0.10586]
");
    printf("(c) 2015 Microsoft Corporation。保留所有權利。
");

}
void Processing(char *ch)//處理函數
{
    int i = 0;
    char key;
    if(!strcmp(ch, "help"))
    {
        for(i = 0; i < count; i++)
        {
            printf("%s	", cmd[i].character);
            printf("%s
", cmd[i].explain);
        }
    }else
    {
        for(i = 0; i < count; i++)
        {
            if(!strcmp(ch, cmd[i].character))
            {
                if(cmd[i].category == 1)
                    printf("%s為内部指令
", cmd[i].character);
                else
                    printf("%s為外部指令
", cmd[i].character);
                printf("作用是:%s
", cmd[i].explain);
                getchar();//清除緩存
                printf("是否執行該指令(y/n):");
                scanf("%c", &key);
                if(key == 'y' || key == 'Y')
                    system(cmd[i].character);
                break;
            }
        }
        if(i == count)
            printf("'%s' 不是内部或外部指令,也不是可運作的程式
或批處理檔案。
", ch);
    }
}

int main(void)
{
    char ch[30];
    char *p;
    Init();    
    Title();
    do
    {
        printf("
C:\>");
        scanf("%s", ch);
        p = strlwr(ch);//将大寫字元轉化為小寫字元
        Processing(p);
    }while(strcmp(ch, "quit"));

    return 0;
}      
  1. 4.     運作結果及分析

  實驗結果與預期相符

四、實驗總結

  1. 複習鞏固了大一學習的c語言,對結構體用法,檔案讀寫更為熟練
  2. 在讀取檔案時按一定格式讀取,分别存儲
  3. 在解決輸入字元串的大小寫轉化過程中,查詢資料學習到
    1. char *strupr(char *s) 将字元串s轉換為大寫形式

      說明:隻轉換s中出現的小寫字母,不改變其它字元。傳回指向s的指針。

    2. char *strlwr(char *s) 将字元串s轉換為小寫形式

      說明:隻轉換s中出現的大寫字母,不改變其它字元。傳回指向s的指針。

  4. 學習到在c語言中用system()函數執行dos指令