实验一、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. Windows系统Python 虚拟环境virtualenv安装

    1.我们用pip安装virtualenv >pip3 install virtualenv 2.创建工程目录 >mkdir myproject 3.进入工程目录 >cd myproj ...

  2. Django 中跨 app 创建外键、多对多引用的方法

    问题描述 我的 Django 项目中有两个 app. 在 PersonalCenter app下的 models.py 下定义了一个 Footprint 类: 在 LoginAndRegister a ...

  3. ubuntu 和windows 分别在anaconda上安装tensorflow

    windows下 的anaconda安装tensorflow: 在Anaconda Prompt中:conda install tensorflow python=3.5一直下载失败.总结一下原因可能 ...

  4. Python-dataframe合并(merge函数)

    import pandas as pd import numpy as np df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1' ...

  5. drag element

    <div id="logDiv" draggable="true" style="border: 2px dotted red; width: ...

  6. 20155217 《Java程序设计》第三次实验报告

    20155217 <Java程序设计>第三次实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

  7. WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书

    原文:WPF中Popup控件在Win7以及Win10等中的对齐点方式不一样的解决方案 - 简书 最近项目中使用弹出控件Popup,发现弹出框的对齐方式在不同的系统中存在不同(Popup在win10上是 ...

  8. php S3调用SDK示例 AmazonS3

    demo.php <?php /* * To change this license header, choose License Headers in Project Properties. ...

  9. flume 安装过程记录

    1.安装jdk 2.下载安装包 : apache-flume-1.7.0-bin.tar.gz 安装包是在win下载的,需要拖动到ubuntu下的/home/hadoop (拖动不了需要先安装  lr ...

  10. ES6中的promise

    Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形 ...