zoukankan      html  css  js  c++  java
  • 操作系统作业一——仿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=0;i<5;i++)
    {
        if(get[i]!='')
    {
        if(get[i]<='Z' && get[i]>='A')
    {
    get[i]=get[i]+32;
    
    }
    
    }
    
    }

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

     这是主函数:

    #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] 版权所有 1985—2001 Microsoft Corporation 保留所有权利 ");
    p=fopen("D:\data.txt","r");
    if((p=fopen("D:\data.txt","r"))==NULL)
    {printf(" D盘中缺少原数据,请确定D盘是否有Data.txt ");
    }

    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(" C:\Documents and Settings Adminstrator>");
    y=0;
    gets(get);
    /*转换小写的程序段*/

    for(int i=0;i<5;i++)
    {
    if(get[i]!='')
    {
    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 ",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(",属于外部命令 ");}
    else{printf(",属于内部命令 ");}
    if(txt[i].refer==1){printf("需要参数 ");}
    else{printf("不需要参数 ");}

    y=1;
    break;
    }


    } if(y==0){printf("%s 不是内部或外部命令,也不是可运行程序 ",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 ");
    }

    while(1){

    printf("名称 ");
    gets(txt[i].a);
    printf("描述 ");
    gets(txt[i].describe);
    printf("内部命令为1;外部为0 ");
    scanf("%d",&txt[i].flag);
    printf("需要参数记为1,不需要记为0 ");
    scanf("%d",&txt[i].refer);
    nu++;
    i++;
    printf("继续? ");
    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.

     

  • 相关阅读:
    javascript学习笔记-数据类型
    chrome console.log API
    Mysql下SELECT的结果集作为UPDATE的WHERE条件时的SQL语法
    Ajax、Comet、Websocket、SSE
    Model View Controller(MVC) in PHP
    区别Transform、Transition、Animation
    WAI-ARIA无障碍网页应用属性完全展示
    理解 PHP output buffer
    清除Jquery动画的队列
    git常用命令
  • 原文地址:https://www.cnblogs.com/bestmoment/p/5290808.html
Copyright © 2011-2022 走看看