一、實驗目的
(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)中源程式名0311.c
可執行程式名:0311.exe
- 2. 原理分析及流程圖
用檔案讀寫的方式将指令及指令作用存入結構體數組
指令解釋程式的原理:
指令解釋程式的主要功能是:
接受和執行一條使用者從鍵盤輸入的指令,它通常儲存一張指令名字(動詞)表,其中記錄着所有操作指令及其處理程式的入口位址或有關資訊。
指令解釋程式實作的兩種方式 :
一種是它自身包含了指令的執行代碼;
另一種是由專門的“系統程式” 實作,自身不含指令處理代碼,也不進行處理,僅僅把這條指令對應的指令檔案裝入記憶體執行。
- 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]\n");
printf("(c) 2015 Microsoft Corporation。保留所有權利。\n");
}
void Processing(char *ch)//處理函數
{
int i = 0;
char key;
if(!strcmp(ch, "help"))
{
for(i = 0; i < count; i++)
{
printf("%s\t", cmd[i].character);
printf("%s\n", cmd[i].explain);
}
}else
{
for(i = 0; i < count; i++)
{
if(!strcmp(ch, cmd[i].character))
{
if(cmd[i].category == 1)
printf("%s為内部指令\n", cmd[i].character);
else
printf("%s為外部指令\n", cmd[i].character);
printf("作用是:%s\n", 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' 不是内部或外部指令,也不是可運作的程式\n或批處理檔案。\n", ch);
}
}
int main(void)
{
char ch[30];
char *p;
Init();
Title();
do
{
printf("\nC:\\>");
scanf("%s", ch);
p = strlwr(ch);//将大寫字元轉化為小寫字元
Processing(p);
}while(strcmp(ch, "quit"));
return 0;
}


#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]\n");
printf("(c) 2015 Microsoft Corporation。保留所有權利。\n");
}
void Processing(char *ch)//處理函數
{
int i = 0;
char key;
if(!strcmp(ch, "help"))
{
for(i = 0; i < count; i++)
{
printf("%s\t", cmd[i].character);
printf("%s\n", cmd[i].explain);
}
}else
{
for(i = 0; i < count; i++)
{
if(!strcmp(ch, cmd[i].character))
{
if(cmd[i].category == 1)
printf("%s為内部指令\n", cmd[i].character);
else
printf("%s為外部指令\n", cmd[i].character);
printf("作用是:%s\n", 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' 不是内部或外部指令,也不是可運作的程式\n或批處理檔案。\n", ch);
}
}
int main(void)
{
char ch[30];
char *p;
Init();
Title();
do
{
printf("\nC:\\>");
scanf("%s", ch);
p = strlwr(ch);//将大寫字元轉化為小寫字元
Processing(p);
}while(strcmp(ch, "quit"));
return 0;
}
