一、目的和要求
1. 實驗目的
(1)掌握指令解釋程式的原理;
(2)掌握簡單的DOS調用方法;
(3)掌握C語言程式設計初步。
2.實驗内容和要求
編寫類似于DOS,UNIX的指令行解釋程式
(1)自行定義系統提示符
(2)自定義指令集(8-10個)
(3)使用者輸入HELP以查找指令的幫助
(4)列出指令的功能,區分内部還是外部指令
(5)使用者輸入QUIT退出
(6)内部指令有dir, cd, md, rd, cls, date, time, ren, copy等。
二、實驗環境
1.PC微機
2.Windows 作業系統
3.C/C++程式開發內建環境
三、 實驗方法、步驟及結果測試
1.源程式名:壓縮封包件(rar或zip)中源程式名dos.c
可執行程式名:xhl.exe
2.原理分析及流程圖
- 指令解釋程式的原理:
指令解釋程式的主要功能是:
1、 接受和執行一條使用者從鍵盤輸入的指令,它通常儲存一張指令名字(動詞)表,其中記錄着所有操作指令及其處理程式的入口位址或有關資訊。
2、指令解釋程式實作的兩種方式 :
1) 一種是它自身包含了指令的執行代碼;
2) 另一種是由專門的“系統程式” 實作,自身不含指令處理代碼,也不進行處理,僅僅把這條指令對應的指令檔案裝入記憶體執行。
例如:在DOS作業系統中,dir、cd、cls等指令的執行代碼包含在系統自身核心中,稱為内部指令;format、help等指令的執行代碼在外部檔案中,稱為外部指令。
3、程式設計實作流程
顯示程式提示資訊;
While(1)
{ 顯示提示符;
接收鍵盤的字元串;
判斷是否quit程式退出指令,是則退出;
判斷是否内部指令,并給出相應的資訊,否則給出錯誤資訊;
}
顯示退出程式資訊;
4. 源代碼:
#include<stdio.h>
#include <stdlib.h>
# include<string.h>
main()
{
char cmd[30][30]={"dir","cd","md","rd","cls","date","time","ren", "copy","quit","help"};
char str[10];
int i;
printf("Microsoft Windows XP [版本 5.1.2600]\n");
printf("(C) 版權所有 1985-2001 Microsoft Corp.\n\n");
while(1){
printf("c:\Documents and Settings\Administrator>");
gets(str);
for(i=0;i<20;i++){
{
if(strcmp(str,cmd[0])==0)
{
printf("類型:内部指令\n");
printf("檢視目前的目錄···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[1])==0)
{
printf("類型:内部指令\n");
printf("顯示目前目錄的名稱···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[2])==0)
{
printf("類型:内部指令\n");
printf("建立一個新目錄···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[3])==0)
{
printf("類型:内部指令\n");
printf("删除該目錄....\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[4])==0)
{
printf("類型:内部指令\n");
printf("清屏···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[5])==0)
{
printf("類型:内部指令\n");
printf("顯示或設定日期···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[6])==0)
{
printf("類型:内部指令\n");
printf("顯示或設定系統時間···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[7])==0)
{
printf("類型:内部指令\n");
printf("重命名檔案···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[8])==0)
{
printf("類型:内部指令\n");
printf("将至少一個檔案複制到另一個位置···\n");
printf("\n");
printf("\n");
break;
}
else if(strcmp(str,cmd[9])==0)
{
return 0;
}
else if(strcmp(str,cmd[10])==0)
{
printf("類型:外部指令\n");
printf("dir\t内部指令 顯示一個目錄中的檔案和子目錄。\n");
printf("cd\t内部指令 顯示目前目錄的名稱或将其更改。\n");
printf("md\t内部指令 建立一個目錄。\n");
printf("rd\t内部指令 删除目錄。.\n");
printf("cls\t内部指令 清除螢幕。\n");
printf("date\t内部指令 顯示或設定日期。\n");
printf("time\t内部指令 内部指令顯示或設定系統時間。\n");
printf("ren\t内部指令 重新命名檔案。\n");
printf("cope\t内部指令 将至少一個檔案複制到另一個位置。\n");
printf("help\t外部指令 提供Windows指令的幫助資訊。\n");
printf("quit\t外部指令 退出指令解釋程式\n");
printf("\n");
printf("\n");
/* printf("CALL\t從一個批處理程式調用這一個。\n");
printf("CMD\t打開另一個Windows指令解釋視窗。\n");
printf("COLOR\t設定預設控制台前景和背景顔色。\n");
printf("DEL\t删除至少一個檔案。\n");
printf("EXIT\t退出指令解釋程式。\n");
printf("FIND\t在一個或多個檔案中搜尋一個文本字元串。\n");
printf("MKDIR\t建立一個目錄。\n");
printf("MODE\t配置系統裝置。\n");
printf("PRINT\t列印一個文本檔案。\n");
printf("REPLACE\t替換檔案。\n");
printf("RENAME\t重新命名檔案。\n");*/
break;
}else if(strcmp(str,cmd[i])!=0){
printf("此指令不是内部或外部指令,也不是可運作的程式或批處理檔案\n");
printf("\n");
break;}
}
}
}
}
5.結果參考圖
