實驗一 指令解釋程式的編寫
一、目的和要求
- 掌握指令解釋程式的原理;
- 掌握簡單的DOS調用方法;
- 掌握C語言程式設計初步。
二、實驗要求
編寫類似于DOS,UNIX的指令行解釋程式
- 自行定義系統提示符
- 自定義指令集
- 使用者輸入HELP以查找指令的幫助
- 列出指令的功能,區分内部還是外部指令
- 使用者輸入QUIT退出
- 内部指令有dir,cd,md,rd,cls,date,time,ren,copy等
三、程式設計實作流程
顯示程式提示資訊;
While(1)
{ 顯示提示符;
接收鍵盤的字元串;
判斷是否quit程式退出指令,是則退出;
判斷是否内部指令,并給出相應的資訊,否則給出錯誤資訊;
}
顯示退出程式資訊;
具體實作:
- 整體展現
本程式利用C語言檔案存儲的方式實作cmd指令相關資訊的存儲,相關代碼片段為:
FILE *fp;
fp=fopen("E:\\caozuo.txt","a+");打開檔案,采用可寫入方式,原檔案夾的檔案不會覆寫,将會在檔案最後面加上。
fclose(fp);關閉檔案。
2.顯示提示符
顯示界面輸入,界面如下:

3.接收鍵盤的字元串;
接受鍵盤輸入的字元串,輸入的字元串采用結構體的方法實作,存儲到TXT檔案中,可以友善一直使用。具體實作代碼如下:
1 void input()
2 { FILE *fp;
3 fp=fopen("E:\\caozuo.txt","a+");
4 int i;
5 int n;
6 printf("請輸入你要錄入的個數n\n:");
7 scanf("%d",&n);
8 for(i=0;i<n;i++)
9 {
10 printf("輸入cmd指令符\n:");
11 scanf("%s",cmd[i].name);
12 printf("輸入cmd指令符類型\n:");
13 scanf("%s",cmd[i].type);
14 printf("輸入cmd指令符功能\n:");
15 scanf("%s",cmd[i].function);
16 fwrite(&cmd[i],sizeof(struct cmd),1,fp);
17 }
上面這段是錄入資訊的代碼片段。
接受鍵盤輸入指令符進行判斷則定義一個數組search[]和已有的存儲的資訊進行判斷,例如:
char search[5];
scanf("%s",search);
判斷語句(部分):if(strcmp(search,other[i])==0)
4.判斷是否quit程式退出指令,是則退出;并顯示退出程式資訊
實作代碼:
1 for(i=0;i<2;i++)
2 {
3 if(strcmp(search,another[i])==0)
4 { printf(" quit 外部指令 将退出指令解釋程式 \n");
5 printf("\n");
6 printf("程式結束\n ");
7 printf("\n");
8
9 exit (0);
10 }
實作結果如圖:
5.判斷是否内部指令,并給出相應的資訊,否則給出錯誤資訊;
判斷(随機):
四、實驗拓展
實作大小寫的輸入:
本程式主要是實作大寫轉為小寫即可,小寫能實作:
實作具體代碼為:
1 for( i=0;i<strlen(search);i++)
2 {
3 search[i] = tolower(search[i]);
4
5 }
實作此功能需要加上頭檔案#include <string.h>和#include <ctype.h>
實作結果為:
五:實驗總結
了解了cmd的運作與實作,和最基礎的指令相關資訊。
六、源程式為:
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <ctype.h>
5 #define N 10
6
7 typedef struct cmd
8 {
9 char name[5];
10 char type[10];
11 char function[30];
12 }CMD;
13 CMD cmd[N];
14
15 void input()
16 { FILE *fp;
17 fp=fopen("E:\\caozuo.txt","a+");
18 int i;
19 int n;
20 printf("請輸入你要錄入的個數n\n:");
21 scanf("%d",&n);
22 for(i=0;i<n;i++)
23 {
24 printf("輸入cmd指令符\n:");
25 scanf("%s",cmd[i].name);
26 printf("輸入cmd指令符類型\n:");
27 scanf("%s",cmd[i].type);
28 printf("輸入cmd指令符功能\n:");
29 scanf("%s",cmd[i].function);
30 fwrite(&cmd[i],sizeof(struct cmd),1,fp);
31 }
32 fclose(fp);
33 }
34
35 /*void convert()
36 {
37 char search[5];
38 for(int i=0;i<strlen(search);i++)
39 {
40 search[i] = tolower(search[i]);
41
42 }
43 }*/
44 void searchone()
45 { int i;
46 char other[6][6]={"help"};
47 char another[6][6]={"quit"};
48 char a[]="C:\\Users\\Administrator>";
49 FILE *fp;
50 fp=fopen("E:\\caozuo.txt","rb");
51
52 char search[5];
53
54 printf("%s:",a);
55
56 scanf("%s",search);
57
58 for( i=0;i<strlen(search);i++)
59 {
60 search[i] = tolower(search[i]);
61
62 }
63 for(i=0;i<2;i++)
64 {
65 if(strcmp(search,another[i])==0)
66 { printf(" quit 外部指令 将退出指令解釋程式 \n");
67 printf("\n");
68 printf("程式結束\n ");
69 printf("\n");
70
71 exit (0);
72 }
73 else
74 if(strcmp(search,other[i])==0)
75 {
76 printf("help 外部指令 提供Windows指令的幫助資訊\n");
77 printf("有關某個指令的詳細資訊,請鍵入 help 指令名\n");
78 printf("\n");
79 for(i=0;fread(&cmd[i],sizeof(struct cmd),1,fp)==1;i++)
80 {
81
82 printf(" %s %s %s \n",cmd[i].name,cmd[i].type,cmd
83
84 [i].function);
85
86 }
87 fclose(fp);
88
89 }
90
91 else
92
93 for(i=0;i<20;i++)
94 {
95 fread(&cmd[i],sizeof(struct cmd),1,fp);
96 if(strcmp(search, cmd[i].name)==0)
97 printf(" %s %s %s \n",cmd[i].name,cmd[i].type,cmd
98
99 [i].function);
100
101 }
102
103
104 fclose(fp);
105
106 }
107 }
108
109
110
111 main()
112 {
113 int j=1;int i;
114
115 printf("Microsoft Windows [版本 6.1.7601]\n");
116 printf("版權所有 (c) 2009 Microsoft Corporation。 保留所有權利。\n");
117 printf(" \n");
118 //input ();
119
120 while(j==1) { searchone(); }
121
122 }