起因:
突然觉得很有必要记录一下自己学习代码的过程,因为很多时候会很迷茫,尽管做了一些题,但有一部分并不是从头到尾都是独立思考并完成的。而这,很有可能会导致对个人代码能力的提高没有什么太大的帮助。(还有一个原因是,我真的经常忘记R说了好几遍的东西emmmm
今天想记录的是1019,这道题刚开始的输入我就有很多疑惑,比如cin>>某个char数组的过程与结果是怎么样的,会不会出现编译错误……
题目:
输入一个文件夹中的所有文件的相关信息(名称、大小、修改时间等)。然后用它给的指令LIST /*****进行排序(注意中间有个空格
注意:
日期与时间中间含有空格,考虑下面的知识点1,因此,为了方便输入与输出,将这两个东西存在不同的char数组中
需要学会的知识点:
-
cin>>组读到空白字符(空格、换行符、制表符)时停止读入。当然这时候由于字符串结束了,字符串的末尾将被添加一个’\0’。
eg.
struct field
{
char date[4];
char time[100];
}
同一个struct里面的数据所占的内存一般是连续的,如下图
‘’数组里未赋值过的位置上放的是’\0‘
‘\0’=0;
‘0’!=0;
‘0’=48; -
数组要开大,eg.100开个111之类的(原因:读取时可能因为数组不够大‘\0’被放到后面的数组里去,然后第二个数组输入时又被覆盖掉
-
字符串不能直接用==来比较,应该用strcmp(注意头文件里应该加上cstring)
-
用sort时,头文件里加上#include
-
错误示范:
char a={"/",“N”,“A”,“M”,“E”}
正确示范(定义char数组
char name[]="/NAME";
或者
char name[]={’/’,‘N’,‘A’,‘M’,‘E’};
注意点:其实strcmp("/NAME",s)可以直接比较,不用另外搞数组("/NAME"可以直接看成字符串 -
在某些特殊情况(比如忘了某些字符对应的ascii码)下可以另外开一个cpp,把怀疑有问题的地方单独拿过去,先改对了再回来继续改剩下的部分。大部分情况下还是可以通过中间输出来进行调试
-
在测试数据量很大的情况下,可以通过文件来更好的比较
文操
在main函数开头加上
freopen(" 1019.in",“r”,stdin);
freopen(“1019.ans”,“w”,stdout) ;
然后在程序的目录创建一个 1019.in里面放上样例输入
程序就会出来一个1019.ans
把样例输出也复制到另一个1019.out里面
用sublime打开,为了更好的对比,把out和ans放在一起(步骤:view——layout ——columns: 2 )
每运行一次会直接覆盖掉上一次的out
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <iomanip>
using namespace std;
char a[20],b[20];
struct field
{
char date[20];
char time[20];
int size;
char name[1000];
}file[1001];
bool Ncmp(const field a1,const field a2)
{
return strcmp(a1.name,a2.name)<0;
};
bool Scmp(const field a1 ,const field a2)
{
if(a1.size!=a2.size) return (a1.size<a2.size);
else return strcmp(a1.name,a2.name)<0;
};
bool Tcmp(const field a1 ,const field a2)
{
if(strcmp(a1.date,a2.date)!=0) return strcmp(a1.date,a2.date)<0;
if(strcmp(a1.date,a2.date)==0)
{
if(strcmp(a1.time,a2.time)!=0) return strcmp(a1.time,a2.time)<0;
if(strcmp(a1.time,a2.time)==0) return strcmp(a1.name,a2.name)<0;
}
};
int main()
{
int n;
int cnt=0;
for(int i=1;i<=100;i++)
{
cin>>n;
if(n==0) break;
if(i!=1) cout<<endl<<endl;
for(int j=1;j<=n;j++) cin>>file[j].date>>file[j].time>>file[j].size>>file[j].name;
cin>>a>>b;
if(strcmp(b,"/NAME")==0) sort(file+1,file+n+1,Ncmp);
if(strcmp(b,"/SIZE")==0) sort(file+1,file+n+1,Scmp);
if(strcmp(b,"/TIME")==0) sort(file+1,file+n+1,Tcmp);
for(int j=1;j<=n;j++)
{
cout<<file[j].date<<" "<<file[j].time<<" "<<setw(16)<<file[j].size<<" "<<file[j].name;
if(j!=n) cout<<endl;
}
}
return 0;
}