实验一、命令解释程序的编写
专业:商软(2)班 姓名:列志华 学号:201406114254
一、 实验目的
(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. 源程序名:压缩包文件中源程序名 MiniOS.cpp
可执行程序名:MiniOS.exe
2. 原理分析及流程图
本次实验主要是把命令放到记事本里面,最后通过程序来读取文档,这样的做法主要是方便更改数据。
在程序里建一个命令结构体,里面包含了命令名、命令功能、判断内部或外部命令的编号、参数,如:
1 typedef struct node 2 { 3 char order[9]; 4 char exp[35]; 5 int post; 6 int arg; 7 struct node *next; 8 }ORDER;
最后通过用户输入的字符串,比较是否与记事本里面的命令名一样,相同则输出该命令的所有信息,
若不同则输出该命令不是内部命令或外部命令。如果用户输入exit,则程序结束。
3. 主要程序段及其解释
1 /* 2 完成时间: 3.22 22:30 pm 3 首次发表时间:3.22 22:53 pm 4 修改时间: 3.24 22:09 pm 5 */ 6 7 8 9 #include<stdio.h> 10 #include<stdlib.h> 11 #include<string.h> 12 #include<cstdlib> 13 14 typedef struct node 15 { 16 char order[9]; 17 char exp[35]; 18 int post; 19 int arg; 20 struct node *next; 21 }ORDER; 22 int saveflag = 0; 23 24 void initInfo(ORDER *head) 25 { 26 ORDER *p,*z; 27 FILE *fp1; 28 int i; 29 z = head; 30 if((fp1 = fopen("cmd_1.txt", "a+")) == NULL) 31 { //打开命令文件 32 printf("cmd_1.txt is NULL!!!"); 33 return; 34 } 35 36 for(i = 0 ; !feof(fp1)&&fgetc(fp1)!=EOF ; i++) 37 { 38 p=(ORDER*)malloc(sizeof(ORDER)); 39 fseek(fp1,-1L,SEEK_CUR); 40 fscanf(fp1,"%s%s%d%d",&p->order,&p->exp,&p->post,&p->arg); 41 p->next=NULL ; 42 z->next=p;/*构造链表*/ 43 z=p; 44 } 45 fclose(fp1); 46 } 47 48 //用于把大写字母转为小写字母 49 char toDownCase(char ch) 50 { 51 if(( 'A' <= ch) &&(ch <= 'Z')) 52 { 53 return (ch + 32); 54 } 55 return ch; 56 } 57 58 59 //对用户的输入进行识别。 60 void discern(ORDER *head) 61 { 62 ORDER *p; 63 char user[10]; 64 int i = 0,flag = 0; 65 while(1) 66 { 67 printf("C:\\Users\\Administrator>"); 68 scanf("%s",&user); 69 for(i=0 ; user[i] != '\0' ; i++) 70 user[i] = toDownCase(user[i]); 71 if(strcmp(user,"exit") == 0) 72 { flag = 1; 73 exit(0); 74 } 75 else if(strcmp(user,"help") == 0) 76 { 77 printf("有关某个命令的详细信息,请键入 HELP 命令名\n"); 78 p = head->next; 79 while(p != NULL) 80 { 81 82 printf("%-9s%s\n",p->order,p->exp); 83 p = p->next; 84 } 85 flag = 1; 86 printf("\n"); 87 } 88 else if((strcmp(user,"\n") == 0)) 89 { 90 continue; 91 flag = 1; 92 } 93 else 94 { 95 p = head->next; 96 flag = 0; 97 while(p != NULL) 98 { 99 if(strcmp(user,p->order) == 0) 100 { 101 if(p->post == 1 && p->arg == 0) 102 { 103 printf("‘%s’内部命令输入正确!\n",p->order); 104 printf("作用是:%s\n\n",p->exp); 105 } 106 else if(p->post == 0 && p->arg == 0) 107 { 108 printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",p->order); 109 } 110 else 111 { 112 printf("命令语法不正确。没有参数!!!\n"); 113 } 114 flag = 1; 115 116 } 117 p=p->next; 118 } 119 } 120 if(flag == 0) 121 { 122 printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",user); 123 } 124 125 } 126 } 127 128 129 void main() 130 { 131 ORDER *head,*p,*z; //系统的命令集合,和解析。 132 char user[10]; //用户的输入。 133 134 head = (ORDER*)malloc(sizeof(ORDER)); 135 head->next =NULL; 136 137 printf("Microsoft Windows XP [版本 5.1.2600]\n"); 138 printf("(C) 版权所有 1985-2001 Microsoft Corp.\n\n"); 139 140 initInfo(head); 141 discern(head); 142 143 }
测试结果与预期结果一样。
四、 实验总结
通过本次实验我进一步加深了对结构体和数组的了解,也学会了如何通过C语言读取记事本里面的数据内容。
通过询问同学和上网搜索相关知识,最后还是成功地解决了问题。