實驗一、命令解釋程式的編寫
專業:商軟二班 姓名:林集團 學號:201406114244
一、 實驗目的
(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)中源程式名×××.c
可執行程式名:×××.exe
- 2. 原理分析及流程圖
主要總體設計問題。
(包括儲存結構,主要演算法,關鍵函式的實現等)
- 3. 主要程式段及其解釋:
//自行定義系統提示符
void Define(CMD c[20])
{
int i=0;
char *name[11]={"dir","cd","md","rd","cls","date","time","ren","cope","help","quit"};
char *type[11]={"內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","外部命令","外部命令"};
char *func[11]={"顯示一個目錄中的檔案和子目錄","顯示當前目錄的名稱或將其更改","建立一個目錄","刪除目錄","清除螢幕","顯示或設定日期",
"內部命令顯示或設定系統時間","重新命名檔案","將至少一個檔案複製到另一個位置","提供Windows命令的幫助資訊","退出命令解釋程式"};
//將已定義好的提示符依次賦值給陣列c
for(i=0;i<11;i++)
{
strcpy(c[i].command_name,name[i]);
strcpy(c[i].command_type,type[i]);
strcpy(c[i].command_func,func[i]);
}
}
//從鍵盤輸入命令提示符,並輸出相關結果
void Input(CMD c[20])
{
char name[20];
int i;
while(1)
{
printf("C:\\Documents and Settings\\Administrator>");
gets(name);
//若輸入help或HELP,則輸出全部提示符資訊
if(strcmp("HELP",name)==0 || strcmp("help",name)==0)
{
for(i=0;i<11;i++)
{
printf("%s",c[i].command_name);
putchar('\t');
printf("%s",c[i].command_type);
putchar('\t');
printf("%s",c[i].command_func);
putchar('\n');
}
putchar('\n');
}
//若輸入quit,則退出程式
else if(strcmp("quit",name)==0)
{
return;
}
else
{
for(i=0;i<11;i++)
{
if(strcmp(c[i].command_name,name)==0)
{
printf("%s",c[i].command_name);
putchar('\t');
printf("%s",c[i].command_type);
putchar('\t');
printf("%s",c[i].command_func);
putchar('\n');
putchar('\n');
break;
}
}
//若沒有輸入自定義的提示符,則給出相關提示
if(i>=11)
{
printf("'%s'不是內部或外部命令,也不是可執行的程式或批處理檔案\n\n",name);
}
}
}
}
- 4. 執行結果及分析
四、 實驗總結
難點:沒有具體完成命令提示符的現實功能。以及沒有其他命令提示符的主要功能介紹,如ASSOC,CALL等。
自身程式缺點:簡單地完成各個命令提示符的相關介紹,並沒有像系統提供的那樣全面。不過這讓我瞭解了程式執行原理。
原始碼:
#include<stdio.h> #include<string.h> struct cmd { char command_name[10]; //提示符名字 char command_type[10]; //提示符命令型別 char command_func[100]; //提示符功能 }; typedef struct cmd CMD; void Head(); void Define(CMD c[20]); void Input(CMD c[20]); main() { CMD c[20]; Head(); Define(c); Input(c); } //設定控制檯頭部 void Head() { printf("Microsoft Windows XP [版本 5.1.2600]\n"); printf("(C) 版權所有 1985-2001 Microsoft Corp.\n\n"); } //自行定義系統提示符 void Define(CMD c[20]) { int i=0; char *name[11]={"dir","cd","md","rd","cls","date","time","ren","cope","help","quit"}; char *type[11]={"內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","內部命令","外部命令","外部命令"}; char *func[11]={"顯示一個目錄中的檔案和子目錄","顯示當前目錄的名稱或將其更改","建立一個目錄","刪除目錄","清除螢幕","顯示或設定日期", "內部命令顯示或設定系統時間","重新命名檔案","將至少一個檔案複製到另一個位置","提供Windows命令的幫助資訊","退出命令解釋程式"}; //將已定義好的提示符依次賦值給陣列c for(i=0;i<11;i++) { strcpy(c[i].command_name,name[i]); strcpy(c[i].command_type,type[i]); strcpy(c[i].command_func,func[i]); } } //從鍵盤輸入命令提示符,並輸出相關結果 void Input(CMD c[20]) { char name[20]; int i; while(1) { printf("C:\\Documents and Settings\\Administrator>"); gets(name); //若輸入help或HELP,則輸出全部提示符資訊 if(strcmp("HELP",name)==0 || strcmp("help",name)==0) { for(i=0;i<11;i++) { printf("%s",c[i].command_name); putchar('\t'); printf("%s",c[i].command_type); putchar('\t'); printf("%s",c[i].command_func); putchar('\n'); } putchar('\n'); } //若輸入quit,則退出程式 else if(strcmp("quit",name)==0) { return; } else { for(i=0;i<11;i++) { if(strcmp(c[i].command_name,name)==0) { printf("%s",c[i].command_name); putchar('\t'); printf("%s",c[i].command_type); putchar('\t'); printf("%s",c[i].command_func); putchar('\n'); putchar('\n'); break; } } //若沒有輸入自定義的提示符,則給出相關提示 if(i>=11) { printf("'%s'不是內部或外部命令,也不是可執行的程式或批處理檔案\n\n",name); } } } }