文件排序——Roj_thinking1019

起因:
突然觉得很有必要记录一下自己学习代码的过程,因为很多时候会很迷茫,尽管做了一些题,但有一部分并不是从头到尾都是独立思考并完成的。而这,很有可能会导致对个人代码能力的提高没有什么太大的帮助。(还有一个原因是,我真的经常忘记R说了好几遍的东西emmmm
今天想记录的是1019,这道题刚开始的输入我就有很多疑惑,比如cin>>某个char数组的过程与结果是怎么样的,会不会出现编译错误……
题目:
输入一个文件夹中的所有文件的相关信息(名称、大小、修改时间等)。然后用它给的指令LIST /*****进行排序(注意中间有个空格
注意:
日期与时间中间含有空格,考虑下面的知识点1,因此,为了方便输入与输出,将这两个东西存在不同的char数组中
需要学会的知识点:

  1. cin>>组读到空白字符(空格、换行符、制表符)时停止读入。当然这时候由于字符串结束了,字符串的末尾将被添加一个’\0’。
    eg.
    struct field
    {
    char date[4];
    char time[100];
    }
    同一个struct里面的数据所占的内存一般是连续的,如下图
    在这里插入图片描述
    在这里插入图片描述
    ‘’在这里插入图片描述数组里未赋值过的位置上放的是’\0‘
    ‘\0’=0;
    ‘0’!=0;
    ‘0’=48;

  2. 数组要开大,eg.100开个111之类的(原因:读取时可能因为数组不够大‘\0’被放到后面的数组里去,然后第二个数组输入时又被覆盖掉

  3. 字符串不能直接用==来比较,应该用strcmp(注意头文件里应该加上cstring)

  4. 用sort时,头文件里加上#include

  5. 错误示范:
    char a={"/",“N”,“A”,“M”,“E”}
    正确示范(定义char数组
    char name[]="/NAME";
    或者
    char name[]={’/’,‘N’,‘A’,‘M’,‘E’};
    注意点:其实strcmp("/NAME",s)可以直接比较,不用另外搞数组("/NAME"可以直接看成字符串

  6. 在某些特殊情况(比如忘了某些字符对应的ascii码)下可以另外开一个cpp,把怀疑有问题的地方单独拿过去,先改对了再回来继续改剩下的部分。大部分情况下还是可以通过中间输出来进行调试

  7. 在测试数据量很大的情况下,可以通过文件来更好的比较
    文操
    在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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值