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

专业:商软(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. 使用Modernizr探测HTML5/CSS3新特性

    [转] HTML5, CSS3以及相关技术(例如canvas和web sockets)带来了非常有用的特性,可以让我们的web程序提升一个新的level.这些新技术允许我们只用HTML,CSS和Jav ...

  2. 使用maven构建一个helloworld maven项目

    1.下载maven http://maven.apache.org/ 选择一个较新版本下下来 2.配置m2_home环境变量 先解压,新建用户变量m2_home,将bin目录添加到path变量中 3. ...

  3. android 列表开发 ListView

    1.android 端 二个entity consultInfo: private String name; private String id; consultInfoRef private iLi ...

  4. esriSRProjCSType Constants

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

  5. java selenium 项目环境搭建(一)

    1.使用jdk1.7版本.jdk下载,请再百度输入 jdk 1.7下载,环境配置参考

  6. hbase1.1.2安装

    环境:hadoop2.6.1,zk3.4.6 1.配置环境变量 sudo vi /etc/profile.d/hbase-env.sh export HBASE_HOME=/usr/local/hba ...

  7. OC基础(18)

    Category基本概念 Category注意事项 *:first-child { margin-top: 0 !important; } body > *:last-child { margi ...

  8. 翻译:Knockout 快速上手 - 2: 安装 knockoutJS

    只需要五个简单的步骤,就可以做好使用 Knockout 开发的准备! 第一步 我们需要什么? 最低限度,为了完成后面的教程,你需要如下的准备 Web 浏览器 文本编辑器 你的电脑上大约 2M 的磁盘空 ...

  9. [转]整理索引碎片,提升SQL Server速度

    数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了.当选择的数据在原十万条记录之间时,速度还是挺快的:但当选择的数据在这一千条数据之间时,速度变得奇慢. 凭经验,这是索引碎片问 ...

  10. 【转载】linux环境下tcpdump源代码分析

    linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02  CSDN博客 原文链接  http://blog.csdn.net/han_dawei/article/d ...