实验一、命令解释程序的编写

专业:商软(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.      原理分析及流程图

本次实验主要是把命令放到记事本里面,最后通过程序来读取文档,这样的做法主要是方便更改数据。

在程序里建一个命令结构体,里面包含了命令名、命令功能、判断内部或外部命令的编号、参数,如:

      

 typedef struct node
{
char order[];
char exp[];
int post;
int arg;
struct node *next;
}ORDER;

最后通过用户输入的字符串,比较是否与记事本里面的命令名一样,相同则输出该命令的所有信息,

若不同则输出该命令不是内部命令或外部命令。如果用户输入exit,则程序结束。

        3.      主要程序段及其解释

 /*
  完成时间:  3.22 22:30 pm
  首次发表时间:3.22 22:53 pm
  修改时间:  3.24 22:09 pm
*/ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cstdlib> typedef struct node
{
char order[];
char exp[];
int post;
int arg;
struct node *next;
}ORDER;
int saveflag = ; void initInfo(ORDER *head)
{
ORDER *p,*z;
FILE *fp1;
int i;
z = head;
if((fp1 = fopen("cmd_1.txt", "a+")) == NULL)
{ //打开命令文件
printf("cmd_1.txt is NULL!!!");
return;
} for(i = ; !feof(fp1)&&fgetc(fp1)!=EOF ; i++)
{
p=(ORDER*)malloc(sizeof(ORDER));
fseek(fp1,-1L,SEEK_CUR);
fscanf(fp1,"%s%s%d%d",&p->order,&p->exp,&p->post,&p->arg);
p->next=NULL ;
z->next=p;/*构造链表*/
z=p;
}
fclose(fp1);
} //用于把大写字母转为小写字母
char toDownCase(char ch)
{
if(( 'A' <= ch) &&(ch <= 'Z'))
{
return (ch + );
}
return ch;
} //对用户的输入进行识别。
void discern(ORDER *head)
{
ORDER *p;
char user[];
int i = ,flag = ;
while()
{
printf("C:\\Users\\Administrator>");
scanf("%s",&user);
for(i= ; user[i] != '\0' ; i++)
user[i] = toDownCase(user[i]);
if(strcmp(user,"exit") == )
{ flag = ;
exit();
}
else if(strcmp(user,"help") == )
{
printf("有关某个命令的详细信息,请键入 HELP 命令名\n");
p = head->next;
while(p != NULL)
{ printf("%-9s%s\n",p->order,p->exp);
p = p->next;
}
flag = ;
printf("\n");
}
else if((strcmp(user,"\n") == ))
{
continue;
flag = ;
}
else
{
p = head->next;
flag = ;
while(p != NULL)
{
if(strcmp(user,p->order) == )
{
if(p->post == && p->arg == )
{
printf("‘%s’内部命令输入正确!\n",p->order);
printf("作用是:%s\n\n",p->exp);
}
else if(p->post == && p->arg == )
{
printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",p->order);
}
else
{
printf("命令语法不正确。没有参数!!!\n");
}
flag = ; }
p=p->next;
}
}
if(flag == )
{
printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",user);
} }
} void main()
{
ORDER *head,*p,*z; //系统的命令集合,和解析。
char user[]; //用户的输入。 head = (ORDER*)malloc(sizeof(ORDER));
head->next =NULL; printf("Microsoft Windows XP [版本 5.1.2600]\n");
printf("(C) 版权所有 1985-2001 Microsoft Corp.\n\n"); initInfo(head);
discern(head); }

测试结果与预期结果一样。

四、        实验总结

通过本次实验我进一步加深了对结构体和数组的了解,也学会了如何通过C语言读取记事本里面的数据内容。

通过询问同学和上网搜索相关知识,最后还是成功地解决了问题。

操作系统模仿CMD的更多相关文章

  1. 实验一 操作系统模仿cmd

    实验一.命令解释程序的编写 专业:商软(2)班   姓名:王俊杰  学号:201406114252 一.        实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3 ...

  2. cmd:WIN7操作系统下cmd窗口下的复制粘贴

    1.右击cmd的顶部栏,点开属性 2.在 选项 下,勾选"快速编辑模式" 3.按住鼠标左键标注需要复制的区域 再点击一下右键,则上文的标记区域就已经被复制了,可以通过ctrl+v进 ...

  3. windows10操作系统中cmd窗口下telnet功能失效的解决方案

    查找windows自带功能,在window10中相当方便.打开windows10的设置面板,在搜索栏中搜索“windows功能”,弹出以下界面: 根据弹出的提示“启动或停用windows功能”即可弹出 ...

  4. [Java] cmd命令行如何切换目录

    cmd.exe是微软Windows系统基于WINDOWS上的命令解释程序,类似于微软的DOS操作系统.cmd.exe是一个32位的命令行程序,运行在Windows NT/2000/XP/2003/vi ...

  5. SQL Server代理(2/12):作业步骤和子系统

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. SQL Server代理作业有一系列的一个 ...

  6. SQL Server代理(1/12):配置和概况

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. SQL Server代理是SQL Serv ...

  7. windows注册表学习笔记

    注册表,想起来了就学学,方便操作.无需把它当成重要学问,今日就学一波,作为了解. 一.注册表清理脚本 主要是删除临时文件,旧文件.并不能够删除无效的键 @echo off del/f/s/q %sys ...

  8. 关于oracle数据库(1)

    兼容性的设置 cmd.exe是微软Windows系统的命令行程序,类似于微软的DOS操作系统.cmd.exe是一个16/32位的命令行程序,运行在Windows NT/2000/XP/2003/Vis ...

  9. ODI 创建Java EE Agent

    Configuring the Domain for the Java EE Agent 一 创建数据库 Schema 配置 Java EE agent,之前,必须保证在数据中创建了相应的scheme ...

随机推荐

  1. JadClipse eclipse反编译插件

    A.下载JadClipse,http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download,注意选择与eclipse版本一致的版本 ...

  2. mongoDB索引使用

    for(var i=0;i<10000;i++){ db.user.insert({name:"user"+i,age:i}) }添加这么多数据 db.user.find({ ...

  3. DTD限制XML文件

    需要通过使用Microsoft Visual Studio 2010.XMLSpy或者eclipse软件来检查校验 文件中有中文,需要存为utf-8编码 book.dtd <!ELEMENT 书 ...

  4. label 行距

    NSMutableAttributedString * attributedString1 = [[NSMutableAttributedString alloc] initWithString:te ...

  5. JAVA中集合输出的四种方式

    在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...

  6. Angularjs过滤器的开发.

    先上代码. <!DOCTYPE html> <html ng-app="FilterModule"> <head lang="en" ...

  7. 收缩sql server2008 数据库

    USE DATABASENAME; GO -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DA ...

  8. esriSRProjCS2Type Constants

    ArcGIS Developer Help  (Geometry)   esriSRProjCS2Type Constants See Also esriSRProjCSType Constants ...

  9. 面向对象的ExtJS场景开发

    写ExtJS已经3各月了,项目中临时学的,主要参考ExtJS 的文档学习,推荐一款JS开发工具Aptana Studio 3. 大概说一下开发ExtJS的准备: 1.下载Extjs(目前有4.x我使用 ...

  10. H264 Profile

    H.264有四种profile,对应四种H264画质级别.每个profile支持一组特定的编码功能,并支持一类特定的应用,分别是BP.EP.MP.HP: 1. BP-Baseline Profile ...