操作系统作业一——仿CMD
实验一、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);
}
- 4. 运行结果及分析
这是录入命令函数的截图:

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

这是运行时的截图:

四、 实验总结
遇到的问题:1.在向文件输入数据时用了fprintf但是加了地址符,从而导致TXT中出现了一个问号
2.读取文件fscanf和fprintf格式不统一,使得输出时产生乱码
3.在转换大小写时,判断字符末尾是否为空的时候用了While,导致一直循环跳不出来
解决方法:把While改为If.
操作系统作业一——仿CMD的更多相关文章
- 【操作系统作业-lab4】 linux 多线程编程和调度器
linux多线程编程 参考:https://blog.csdn.net/weibo1230123/article/details/81410241 https://blog.csdn.net/skyr ...
- 【操作系统作业—lab1】linux shell脚本 遍历目标文件夹和所有文件 | 包括特殊字符文件名的处理
要求:写一个linux bash脚本来查看目标文件夹下所有的file和directory,并且打印出他们的绝对路径. 运行command:./myDir.sh input_path output_ ...
- 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 ...
- 【转】Bash脚本实现批量作业并行化
首先附上自己常用的代码 ---------------------------------------------------------------------------------------- ...
- powershell和cmd区别
Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能额外做许多cmd不能做的活. 主要是系统管理功能.脚本语言和在线帮助更强大,你确 ...
- 你知道dos和cmd之间的关系以及区别吗?
含义 dos 英文disk operation system,意思是磁盘操作系统是微软系列操作系统之一,dos是一个独立的操作系统,dos对操作人员的要求是比较高的,操作者需要记住很多的命令,并利用命 ...
- 福州大学2020年春软工实践W班第二次作业
作业描述 这个作业属于哪个课程 福州大学2020年春软工实践W班 这个作业要求在哪里 寒假作业(2/2) 这个作业的目标 开发一个疫情统计程序 作业正文 福州大学2020年春软工实践W班第二次作业 其 ...
- 云服务器内,nginx安装部署,Xshell,Xftp安装
nginx部署 三丰云云服务器,安装nginx nginx部署 在宝塔面板,添加Nginx安装,一般进来会默认推荐安装几款软件,mysql等,暂时可以后面再装,先把nginx装上去,去感受将前端页面放 ...
- Windows下安装MongoDB
项目当中用到MongoDB最为NoSQL数据库,运行的平台为 Windows Server 2008,下面是MongoDB的安装过程笔记: 1.下载软件 官方下载地址:http://www.mongo ...
随机推荐
- 使用Selenium慢慢向下滚动页面
我正试图从航班搜索页面抓取一些数据. 此页面以这种方式工作: 你填写一个表格,然后你点击按钮搜索 – 这没关系.当您单击该按钮时,您将被重定向到包含结果的页面,这就是问题所在.这个页面连续添加结果,例 ...
- Zeta--S3 Linux优化/缩短开机时间
U-Boot1)axp20_set_ldo3实现里面把两个__msdelay(200);去掉,节省400ms2)sys_config.fex把下面的used设置为0,不使用开机指示灯闪烁,可以省掉35 ...
- makefile中重载与取消隐藏规则示例
学习<跟我一起写Makefile-陈皓>后一直不懂,如何重载或取消隐藏规则 为了博客版面整洁,何为隐藏规则,Makefile基本规则编写等基础支持请自行百度. 需要声明的是:这些知识可能在 ...
- 笔记-scrapy-selector
笔记-scrapy-selector scrapy版本:1.5.0 1.总述 scrapy内置selector建立在lxml上. 2.使用 可以使用xpath和css方法来进行解析,两者都返回列表: ...
- 2016-2017-2 20155322 实验三 敏捷开发与XP实践
2016-2017-2 20155322 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点 敏捷开发(Agile Development)是一种以人为核心.迭代.循序 ...
- WPF 一个简单的颜色选择器
原文:WPF 一个简单的颜色选择器 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/8340999 ...
- [BZOJ1857][SCOI2010]传送带-[三分]
Description 传送门 Solution 三分套三分.代码简单但是证明苦兮兮.. 假如我们在AB上选了一个点G,求到该点到D的最小时间. 图中b与CD垂直.设目前从G到D所耗时间最短的路径为G ...
- day 3 局部变量 全局变量
1.局部变量 2.全局变量(死歌的大招)函数前面声明的都是全局变量 3.全局变量和局部变量的区别 1)老方法 def get_temper(): temper = 33 return temper d ...
- CF833D Red-Black Cobweb
题面 题解 点分治大火题... 设白边数量为$a$,黑边为$b$,则$2min(a,b)\geq max(a,b)$ 即$2a\geq b\;\&\&2b\geq a$ 考虑点分治时如 ...
- 【LG3233】[HNOI2014]世界树
题面 洛谷 题解 代码 #include <iostream> #include <cstdio> #include <cstdlib> #include < ...