实验一、CMD实验

2014商软2  卓宇靖  4238

一、        实验目的

(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等。

三、        实验方法、步骤及结果测试

--本次更新新加了大写转换小写功能;

--本次更新添加了记录是否需要参数的功能

      原理分析

本程序用了文件的方法来实现,其中data.txt用来实现名称、解释和用0,1来区分内部和外部命令的功能。因而,该段程序的局限性在于该程序的数据库位于本地硬盘的TXT里,如果直接运行本程序敲命令是打出的命令没有反应,因为它找不到源数据。

函数luru()实现了数据录入和写入功能,为了逼真,该段函数并没有显示出来.要想显示,可以将它前边的注释符号//去掉。

      主要程序段及其解释:

这是转换大小写的函数:

for(int i=;i<;i++)
{
if(get[i]!='\0')
{
if(get[i]<='Z' && get[i]>='A')
{
get[i]=get[i]+; } } }

通过逐个判断用户打字的字符是否为空,不为空时判断是否大写,如是大写转换为小写。

 这是主函数:

#include <IOSTREAM>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<iostream>
using namespace std;
void luru();
typedef struct data{
char a[5];
char describe[50];
int flag;
int refer;
}DATA;
int num=0;//读取文件中记录的命令个数
main(void)
{// luru();
FILE *p;

int i=0;
DATA txt[100];char get[5];
int y=0;//相当于一个布尔变量

printf("Microsoft Windows XP[版本5.1.2600]\n版权所有\n1985—2001 Microsoft Corporation 保留所有权利\n");
p=fopen("D:\\data.txt","r");
if((p=fopen("D:\\data.txt","r"))==NULL)
{printf("\nD盘中缺少原数据,请确定D盘是否有Data.txt\n");
}

while(!feof(p)&&fgetc(p)!=EOF)
{

num++;
}
num=num/66;

fclose(p);

p=fopen("D:\\data.txt","r");
for(i=0;i<100;i++){

fscanf(p,"%10s%50s%5d%d",&txt[i].a,&txt[i].describe,&txt[i].flag,&txt[i].refer);

}

while(1){
printf("\nC:\\Documents and Settings\ \Adminstrator>");
y=0;
gets(get);
/*转换小写的程序段*/

for(int i=0;i<5;i++)
{
if(get[i]!='\0')
{
if(get[i]<='Z' && get[i]>='A')
{
get[i]=get[i]+32;

}

}

}
if(strcmp(get, "quit")==0) {exit(0);}
if(strcmp(get, "help")==0) {y=1;
for(i=0;i<num;i++){

printf("%s功能是 %s\n",txt[i].a,txt[i].describe);
}
}

for(i=0;i<100;i++){

if(strcmp(get, txt[i].a)==0)
{

printf("%s的函数功能是%s",txt[i].a,txt[i].describe);
if(txt[i].flag==1){printf(",属于外部命令\n");}
else{printf(",属于内部命令\n");}
if(txt[i].refer==1){printf("需要参数\n");}
else{printf("不需要参数\n");}

y=1;
break;
}

} if(y==0){printf("%s 不是内部或外部命令,也不是可运行程序\n",get);}
}
fclose(p);

}

void luru()
{

FILE *p;
int choice;
int nu=0;
int i=0;
DATA txt[100];
p=fopen("D:\\data.txt","a");
if((p=fopen("D:\\data.txt","a"))==NULL)
{printf("D盘中缺少原数据,请确定D盘是否有Data.txt\n");
}

while(1){

printf("名称\n");
gets(txt[i].a);
printf("描述\n");
gets(txt[i].describe);
printf("内部命令为1;外部为0\n");
scanf("%d",&txt[i].flag);
printf("需要参数记为1,不需要记为0\n");
scanf("%d",&txt[i].refer);
nu++;
i++;
printf("继续?\n");
scanf("%d",&choice);
getchar();
if(choice!=1){ break;}
}
for( i=0;i<nu;i++){

fprintf(p,"%10s%50s%5d%d",txt[i].a,txt[i].describe,txt[i].flag,txt[i].refer);

}
fclose(p);
}

 

  

  1. 4.      运行结果及分析

这是录入命令函数的截图:

这是输入错误时候的截图:

这是运行时的截图:

 

 

 

 

 

四、        实验总结

遇到的问题:1.在向文件输入数据时用了fprintf但是加了地址符,从而导致TXT中出现了一个问号

2.读取文件fscanf和fprintf格式不统一,使得输出时产生乱码

3.在转换大小写时,判断字符末尾是否为空的时候用了While,导致一直循环跳不出来

解决方法:把While改为If.

 

操作系统作业一——仿CMD的更多相关文章

  1. 【操作系统作业-lab4】 linux 多线程编程和调度器

    linux多线程编程 参考:https://blog.csdn.net/weibo1230123/article/details/81410241 https://blog.csdn.net/skyr ...

  2. 【操作系统作业—lab1】linux shell脚本 遍历目标文件夹和所有文件 | 包括特殊字符文件名的处理

    要求:写一个linux bash脚本来查看目标文件夹下所有的file和directory,并且打印出他们的绝对路径. 运行command:./myDir.sh  input_path  output_ ...

  3. Bash脚本实现批量作业并行化

    http://jerkwin.github.io/2013/12/14/Bash%E8%84%9A%E6%9C%AC%E5%AE%9E%E7%8E%B0%E6%89%B9%E9%87%8F%E4%BD ...

  4. 【转】Bash脚本实现批量作业并行化

    首先附上自己常用的代码 ---------------------------------------------------------------------------------------- ...

  5. powershell和cmd区别

    Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能额外做许多cmd不能做的活. 主要是系统管理功能.脚本语言和在线帮助更强大,你确 ...

  6. 你知道dos和cmd之间的关系以及区别吗?

    含义 dos 英文disk operation system,意思是磁盘操作系统是微软系列操作系统之一,dos是一个独立的操作系统,dos对操作人员的要求是比较高的,操作者需要记住很多的命令,并利用命 ...

  7. 福州大学2020年春软工实践W班第二次作业

    作业描述 这个作业属于哪个课程 福州大学2020年春软工实践W班 这个作业要求在哪里 寒假作业(2/2) 这个作业的目标 开发一个疫情统计程序 作业正文 福州大学2020年春软工实践W班第二次作业 其 ...

  8. 云服务器内,nginx安装部署,Xshell,Xftp安装

    nginx部署 三丰云云服务器,安装nginx nginx部署 在宝塔面板,添加Nginx安装,一般进来会默认推荐安装几款软件,mysql等,暂时可以后面再装,先把nginx装上去,去感受将前端页面放 ...

  9. Windows下安装MongoDB

    项目当中用到MongoDB最为NoSQL数据库,运行的平台为 Windows Server 2008,下面是MongoDB的安装过程笔记: 1.下载软件 官方下载地址:http://www.mongo ...

随机推荐

  1. gi的安装和使用

    Git的安装 git是什么? git是一种版本控制器,更直白的说,团队开发的时候,管理代码使用的软件 Linux下的安装 yum install git Git的配置 在使用git之前,需要先进行配置 ...

  2. 在docker中运行elasticsearch时go程序无法连接到节点

    错误信息: panic: no active connection found: no Elasticsearch node available 在docker中运行es时,默认启动sniffing  ...

  3. centos系统误删libc.so.6

    前段时间遇到开发人员更新glibc版本,把/usr/lib64/libc-2.12.so & libc.so.6 -> libc-2.12.so 这个软连接更改之后导致报错: ls: e ...

  4. [POJ1741]Tree(点分治)

    树分治之点分治入门 所谓点分治,就是对于树针对点的分治处理 首先找出重心以保证时间复杂度 然后递归处理所有子树 对于这道题,对于点对(u,v)满足dis(u,v)<=k,分2种情况 路径过当前根 ...

  5. OAuth(开放授权)

    HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使 ...

  6. js日期控件遇到的问题

    一.问题: 在web项目里有很多时候需要使用日期控件来完成相关的功能,但是日期控件的日期格式又和我们的需求不符 那么,就需要我们来自定义日期的格式完成需求 二.解决: 1.取月末: (1)强制取值: ...

  7. day3 RHCE

    10.配置NFS服务 在server0配置NFS服务,要求如下: 以只读的形式共享目录/public同时只能被example.com域中的系统访问. 以读写的形式共享目录/protected同时只能被 ...

  8. Luogu1445 [Violet]樱花

    题面 题解 $$ \frac 1x + \frac 1y = \frac 1{n!} \\ \frac{x+y}{xy}=\frac 1{n!} \\ xy=n!(x+y) \\ xy-n!(x+y) ...

  9. 【BZOJ3144】[HNOI2013]切糕

    [BZOJ3144][HNOI2013]切糕 题面 题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑 ...

  10. CF 1025 D. Recovering BST

    D. Recovering BST http://codeforces.com/contest/1025/problem/D 题意: 给出一个连续上升的序列a,两个点之间有边满足gcd(ai ,aj) ...