操作系统作业一——仿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 ...
随机推荐
- 一个没有成就而即将退赛的OIer的告别书
期末考试成绩出来了. 我也知道混在这个班的时间不长了. 尽管如此,我觉得父母的意见是正确的,我确实不适合OI.所以我会成为省三都没有的一个OIer. 我不后悔,因为曾经是我自己错了. 我感谢遇到了好的 ...
- go语言 os.Rename() cannot move the file to a different disk drive 怎么办
时值我小病在家休养生息,喜欢跳广场舞的外公来寻求我的帮助,他们跳广场舞是将存有歌曲的U盘插到音响上面,而音响大部分都是只能显示歌曲的索引index,不能直接显示歌曲名,所以为了方便他们会在U盘里面对歌 ...
- Xilinx与modelsim的仿真联调
关于Xilinx与modelsim的仿真联调,尤其是仿真环境的搭建,网上的信息都比较零散,我当初在联调的时候遇到比较多的问题,也是折腾了两天才弄好,下面的步骤我总结得非常详细,可以帮助大家少走弯路. ...
- express添加权限拦截
express通过中间件的方式添加权限拦截 示例代码如下 app.get('/logout', checkLogin); app.get('/logout', function(req, res) { ...
- Linux入门进阶第三天——软件安装管理(下)
一.yum在线安装 之前的rpm包各种依赖性太强!安装复杂,yum的好处就来了: // yum 在redhat是付费服务 1.yum源文件 先进入到yum目录: 我们打开默认生效的Base包 2.光盘 ...
- 20155216 2016-2017-2 《Java程序设计》第十周学习总结
20155216 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 了解计算机网络基础 概念 计算机网络基础,是指将地理位置不同的具有独立功能的多台计算机及其外 ...
- 20155226 2016-2017-2 《Java程序设计》第2周学习总结
20155226 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 了解了基本类型以及初识类类型,熟悉了注释,变量及运算符的使用. 了解了几种运算方式但还不算熟 ...
- cogs696 longest prefix
cogs696 longest prefix 原题链接 IOI1996原题? 其实这题我不会. map+string+手动氧气大法好 //就是这么皮(滑稽 Code // It is made by ...
- Django模板层之templates
一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...
- maven 手动安装jar包
1.问题 maven有时候在pom文件引入jar包会报错,所以可以通过手动导入jar包的方式导入. 2.解决: 通过maven命令导入jar包, mvn install:install-file -D ...