实验一、命令解释程序的编写
专业:商软(2)班 姓名:韩麒麟 学号:201406114253
一、 实验目的
(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.原理分析及流程图
本次实验主要是把命令放到记事本里面,最后通过程序来读取文档,这样的做法主要是方便更改数据。在程序里建一个命令结构体,里面包含了命令名、命令功能、判断内部或外部命令的编号、参数,如 最后通过用户输入的字符串,比较是否与记事本里面的命令名一样,相同则输出该命令的所有信息,若不同则输出该命令不是内部命令或外部命令。如果用户输入exit,则程序结束。
3.主要程序段及其解释
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node { char order[9]; char exp[35]; struct node *next; }ORDER; int saveflag = 0; void InputInfo(ORDER *head) { ORDER *p,*r,*s; int i; char ord[15]; s=head; while(s->next!=NULL) s=s->next; while(1) { BB: r=head->next; printf(" 请输入命令:(0为退出)"); scanf(" %s",ord); if(strcmp(ord,"0")==0) break; while(r!=NULL) { if(strcmp(r->order,ord)==0) { printf(" 信息已存在,输入无效,请重新输入:"); goto BB; } r=r->next; } p=(ORDER*)malloc(sizeof(ORDER)); strcpy(p->order,ord); printf("请输入解释: "); scanf("%s",p->exp); p->next=NULL; s->next=p; s=p; saveflag=1; } } void Open(){ char order[20]; char c[3000]; int i; FILE *p1=fopen("MiniOS.txt","r"); if(!p1) printf("打开失败 "); for(i=0;i<2686;i++) { fscanf(p1,"%c",&c[i]); printf("%c",c[i]); } fclose(p1); printf(" "); if(strcmp(order,"exit")==0){ return 0; } } void Save(ORDER *l) { FILE *f; ORDER *p; int count=0,flag=1; f=fopen("cmd_1.txt","wb"); if(f==NULL) { printf("the file can't be opened!"); return ; } p=l->next; while(p->next != NULL) { if(fwrite(p,sizeof(ORDER),1,f)==1) { p=p->next; count++; } else { flag=0; break; } } if(flag) { printf(" 保存 "); saveflag=0; } fclose(f); } void main() { ORDER *osOrder,*head,*p,*z; //系统的命令集合,和解析。 char user[10],ch1; //用户的输入。 int i; FILE *fp1; head = (ORDER*)malloc(sizeof(ORDER)); head->next =NULL; z = head; if((fp1 = fopen("cmd_1.txt", "ab+")) == NULL) { printf("cmd_1.txt is NULL!!!"); return; } printf("Microsoft Windows XP [版本 5.1.2600] "); printf("(C) 版权所有 1985-2001 Microsoft Corp. "); for(i = 0 ; !feof(fp1) ; i++) { p=(ORDER*)malloc(sizeof(ORDER)); if(fread(p,sizeof(ORDER),1,fp1) == 1) { p->next=NULL ; z->next=p; z=p; } } fclose(fp1); p = head->next; while(1) { printf("C:\Users\Administrator>"); scanf("%s",&user); if(strcmp(user,"exit") == 0) { if(saveflag==1) { getchar(); printf(" 文档信息发生改变,是否进行保存(y/n)? "); scanf("%c",&ch1); if(ch1=='y' || ch1=='Y') { Save(head); printf(" 保存成功! "); } } exit(0); } else if(strcmp(user,"editor") == 0) { InputInfo(head); } else if(strcmp(user,"help") == 0) { Open(); /* p = head->next; while(p != NULL) { printf("%-9s%s ",p->order,p->exp); p = p->next; }*/ } else if(strcmp(user," ")==0) { system("dir"); } else { p = head->next; while(p != NULL) { if(strcmp(user,p->order) == 0) { printf("内部命令! "); printf("作用为:"); printf("%s ",p->exp); } p=p->next; } } } }