P8824 [传智杯 #3 初赛] 终端 题解

· · 题解

前言:

我是蒟蒻,看不懂 vector 和用 map 的高端写法,所以只能直接模拟字符串了。

题目传送门

代码片段:

这里是一些定义:

string newfile[1001];//新建的文件 
bool iscreate[1001];//记录这个文件是否存在 
int i,j,n,isok; 
string cmd,filename,anotherfilename;//分别为:输入的指令名,文件名与文件被改之后的名称 

touch 指令可以直接遍历,如果找到了同名文件,就不创建,否则就将其文件添加进去。

代码如下:

isok=1;
cin>>filename;
for(j=1;j<=n;j++)
    if(newfile[j]==filename)//同名不能创造文件 
    {
        isok=0;
        break;
    }   
if(isok==1)//创建文件 
{
    iscreate[i]=true;
    newfile[i]=filename;
}

rm 指令也能直接遍历,如果找到了这个文件,就将这个文件设为不存在。

代码如下:

cin>>filename;
for(j=1;j<=n;j++)
    if(newfile[j]==filename)//如果找到了同名文件 
    {
        iscreate[j]=false;//就将文件设为不存在 
        break;
    }   

rename 指令首先判断改后的文件名是否重名,如果没有就遍历文件。如果找到了被改名的文件就对其进行改名操作。

代码如下:

cin>>filename>>anotherfilename;
isok=1;
for(j=1;j<=n;j++)
    if(newfile[j]==anotherfilename)//如果改后的名字重名了就进行标记 
        isok=0;
    if(isok!=0)//如果没有重名 
    {
        for(j=1;j<=n;j++)
            if(newfile[j]==filename)//如果存在此文件就改名 
                newfile[j]=anotherfilename;
    }

ls 指令较为容易实现,直接枚举存在的文件名即可。

代码如下:

for(j=1;j<=n;j++)
    if(iscreate[j]==true)//如果文件存在 
        cout<<newfile[j]<<endl;//就输出文件名 

结语:

完整代码就不再放出了,可以看下通过记录。