P8824 [传智杯 #3 初赛] 终端 题解
蒟蒻的第一篇黄题题解,博客食用效果更佳。
update on 2024/10/17 修复了代码的两处问题
题目传送门
直接按题意模拟即可,这里采用字符串数组。
下面是分段代码:
1. 当操作为 touch,加入文件。
cin>>b;
bool f=1;
for(int i=1;i<cnt;i++){
if(c[i]==b){//特判有没有出现过
f=0;
break;
}
}
if(f==1)c[cnt]=b,cnt++;
2. 当操作为 rm,查找并删除文件,找到了就跳出循环。
cin>>b;
for(int i=1;i<cnt;i++){
if(c[i]==b){//找到了
c[i]="";//删除操作
break;//跳
}
}
3. 当操作为 rename,查找并替换文件,找到了就跳出循环。
cin>>b>>temp;
bool flag=0;
for(int i=1;i<cnt;i++){
if(c[i]==temp){//看这次修改是否会导致重名
flag=1;
break;
}
}
if(flag==0){
for(int i=1;i<cnt;i++){
if(c[i]==b){//修改
c[i]=temp;
break;
}
}
}
4. 当操作为 ls,遍历,如果没被删就输出。
for(int i=1;i<cnt;i++){
if(c[i]!=""){//还没被删
cout<<c[i]<<'\n';//输出,记得换行
}
}
代码注释:
a为输入的操作名,b和temp为输入的文件名,c为文件名的数组。
另外需要注意的是循环遍历的结束条件为
i小于cnt,题面中第三种情况的操作名是ls而不是1s。
AC code:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
string a,b,c[1010];
int cnt=1,n;
int main(){
cin>>n;
while(n--){
cin>>a;
if(a=="touch"){
cin>>b;
c[cnt]=b;
cnt++;
}
else if(a=="rm"){
cin>>b;
for(int i=1;i<cnt;i++){
if(c[i]==b){
c[i]="";
break;
}
}
}
else if(a=="rename"){
string temp;
cin>>b>>temp;
for(int i=1;i<cnt;i++){
if(c[i]==b){
c[i]=temp;
break;
}
}
}
else if(a=="ls"){
for(int i=1;i<cnt;i++){
if(c[i]!=""){
cout<<c[i]<<'\n';
}
}
}
}
return 0;
}
感谢观看!