C++解题 - 系统操作指令

C++解题 - 系统操作指令


时间限制: 1 Sec 内存限制: 128 MB

问题

问题描述
为了方便大家学习,学长准备为大家搭建一个在线判题系统。由于第一次搭建,没有经验,所以有很多东西都需要来边学边整理。通过查阅资料,发现该系统大部分都是在linux操作系统实现。从没有用过linux的学长这时候是一脸懵逼的。但学长可不是一个轻言放弃的人,通过不懈努力,在一天的时间里重装了n多次系统,终于明白了linux系统下的各种命令。由于学长一直以来记性都不太好,所以经常会忘记一些刚刚写好的内容。下面由你来设计一个程序来帮帮他。
具体操作是这样的:
①创建新文件(vi,vim)
输入3个字符串s1,s2,s3。第一个字符串s1代表文件的名称,第二个字符串s2代表文件的所在文件夹(一个文件夹可能有多个文件),第三个字符串是功能块若s3为wq则表示保存并退出,否则代表只退出不保存
②删除文件(rm)
输入一个字符串,表示要删除的文件。若有此文件则删除并输出"xxx文件已删除!",否则输出"无此文件!"
③查找文件(find)
输入一个字符串,表示要查找的文件。若存在则输出此文件所在文件夹,否则输出"未找到此文件!"
注意:若文件名相同,则第二次的路径会覆盖文件本来的路径
输入格式
首先输入一个整数n(0<n<10000),代表接下来要进行的操作次数。
对于每次的操作:
先输入一个字符串x,代表要进行的操作方法
其次按照题目描述中对应的各个操作进行输入
输出格式
对于每次操作输出其结果占一行
样例输入

6
vi
blue_elves /mountain/sea wq
vim
angel /devil q
vim
you /world/people/body/heart wq
rm
angel
rm
blue_elves
find
you

样例输出

无此文件!
blue_elves文件已删除!
/world/people/body/heart

题意
本题要求对三种指令进行识别并实现一定的操作。
思路
可以使用三个函数来实现三种指令功能的调用,使用string []字符串数组来储存文件的名字和路径名字。

代码

#include <iostream>//头文件
#include <string>//包含“.compare()”方法
using namespace std;
//声明全局使用的储存文件路径(FileAddress[10])的字符串数组和储存对应文件夹中的文件(FileLink[10][10])的二维字符串数组
string FileAddress[10],FileLink[10][10];
//声明三个函数都会调用的用于循环的整型变量i、j和三个函数都会使用的字符串变量fname作为文件名
int i,j;
string fname;
//创建文件的函数
void fcrea()
{
    string faddr,comd;//faddr - 路径名;comd - 是否储存的命令;
    bool LinkFlag=1,StepFlag=1;//判断是否需要将空文件名(或路径)储存起来
    int LinkSign,StepSign;//储存最靠前的空文件名(或路径)
    cin >> fname >> faddr >> comd;//输入文件名、目标文件夹路径和是否保存的指令
    if (!comd.compare("wq"))//如果是需要保存则执行代码,否则直接忽略本次创建文件的命令
    {
        for (i=0;i<10;i++)//遍历所有文件夹路径
        {
            if (FileAddress[i].empty()&&LinkFlag)	//若这个文件夹路径不存在且需要使用这个储存路径的空间
            {										//将这个空间的下标储存起来,并将Flag置为‘假’说明不再储存
                LinkSign=i;
                LinkFlag=0;
            }
            if (!FileAddress[i].compare(faddr))		//若存在相同的路径,则判断同路径下是否存在相同的文件
            {
                for (j=0;j<10;j++)//遍历‘这个’文件夹中的所有文件
                {
                    if (FileLink[i][j].empty()&&StepFlag)	//若这个文件名不存在且需要使用这个文件名的空间
                    {										//将这个空间的下标储存起来,并将Flag置为‘假’说明不再储存
                        StepSign=j;
                        StepFlag=0;
                    }
                    if (!FileLink[i][j].compare(fname)) goto fcend;//如果在该文件夹下找到同名文件则跳过创建,直接结束本次命令
                }
                FileLink[i][StepSign]=fname;//若该路径下没有该名字的文件则在最靠前的空间中创建一个
            }
        }
        FileAddress[LinkSign]=faddr;//若不存在该路径,则在最靠前的路径空间中创建该路径
        FileLink[LinkSign][0]=fname;//并在该新路径中新建一个文件
    }
    fcend: ;//作为结束的跳转位,不做任何行动
}
//删除文件的函数
void fdela()
{
    cin >> fname;//输入要删除的文件名
    for (i=9;i>=0;i--)//由于不同路径下可能存在同名文件,根据题意使用靠后的路径,因此反向遍历
    {
        for (j=9;j>=0;j--)//同理【这里同文件夹中不会存在同名文件,因此必要反向遍历,个人习惯吧wo
        {
            if (!FileLink[i][j].compare(fname))//若找到指定文件,输出提示后删除并跳转到函数末端结束本次命令
            {
                cout << fname << "文件已删除!" << endl;
                FileLink[i][j]="";
                goto fdend;
            }
        }
    }
    if (i==-1&&j==-1) cout << "无此文件!" << endl;//若遍历所有空间未找到指定文件,输出特定信息
    fdend: ;
}
//查找文件的函数
void ffind()
{
    cin >> fname;//输入要查找的文件名
    for (i=9;i>=0;i--)//同理,路径覆盖的问题
    {
        for (j=9;j>=0;j--)//。。。
        {
            if (!FileLink[i][j].compare(fname))//若找到指定文件,输出文件所在路径并结束本次命令
            {
                cout << FileAddress[i] << endl;
                goto ffend;
            }
        }
    }
    if (i==-1&&j==-1) cout << "未找到此文件!" << endl;//若遍历所有空间未找到指定文件,输出特定信息
    ffend: ;
}
//主函数
int main()
{
    int t;//声明确定输入命令条数的变量
    string Command;//声明储存命令的字符串变量
    cin >> t;//输入要执行的命令条数
    while (t--)//循环t次
    {
        cin >> Command;//输入命令
        switch (Command[0])//判断命令的第一个字符【因为三个命令的第一个字符不同
        {
            case 'v':fcrea();break;
            case 'r':fdela();break;
            case 'f':ffind();break;
        }
    }
    return 0;
}

运行结果
在这里插入图片描述

总结:

本题的突破点在于想到用函数来分割三种命令,因为对每一块的操作很简单,也不用考虑各个命令之间的联系,分开后只要考虑如何才能正确的实现各自的功能就好辣~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值