实验一、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. docker inspect获取详细参数的两种方法

    docker inspect xx 返回的是一个json格式的数据 以下为部分返回值 [ { "Id": "706813b0da107c4d43c61e3db9da908 ...

  2. electron安装与使用

    系统 WIN10 X64 1. python-2.7.15.amd64.msi 2. node-v10.4.1-x64.msi 3. VS2015 community(社区版) 4. npm conf ...

  3. python 生成随机长度的字符串

    import os def randomString(n): return (''.join(map(lambda xx:(hex(ord(xx))[2:]),os.urandom(n))))[0:1 ...

  4. 无法获得锁 /var/lib/apt/lists/lock - open (11 资源临时不可用)

    具体如下: 1.ps-aux 查出apt-get进程的PID,通常是一个四位数字. 2.用sudo kill PID代码 杀死进程 3.用sudo apt-get update,sudo apt-ge ...

  5. resultMap中的collection集合出现只能读取一条数据的解决方法

    查询数据时只能获得collection集合中的的一条数据,相关情况如下: 结果集resultMap: <resultMap id="ManagerRolesAcls" typ ...

  6. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

  7. 求助:springboot调用存储过程并使用了pagehelper分页时报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

    存储过程如下: dao层的sql Controller层调用: html页面 没有使用pagehelper分页之前,可以正常使用 使用了pagehelper之后就报错 ### Error queryi ...

  8. HBase第二章 基本API

    1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  9. 在 Centos7 用Jexus服务器 运行.Net Core 只需几部

    1.安装 .Net SDK 不需要按照 .net core runtime,sdk 依赖于运行时会自动安装 第一步 添加dotnet源 sudo rpm -Uvh https://packages.m ...

  10. php小项目小结

    最近一直断更,并不是出于什么问题,而是想找个合适的机会去整理下html基本的一些琐碎的知识点 近期突发感冒,吊水,吊错药,原因只是重名重姓,这不是个梗,很是痛苦的现实事故 so,只能用剩下的半天去完成 ...