通话记录
题目描述
使用3个队列,分别保留手机上最近10个,(0)未接来电、(1)已接来电、(2)已拨电话。
输入
全部通话记录,每行一条记录。
每条记录包含两个数字,第一个数代表记录类型,第二个数代表手机号码。
输出
分3列输出未接来电、已接来电、已拨电话。
列之间用空格分割,后接电话在最先输出,不足10条用0占位。
分析:
如过每个队列的数据大于10,则需要区分考虑。博主,在此题中,采用一直保存下来,到最后判断是不是数据大于10,分情况输出!需注意:后接电话在最先输出,不足10条用0占位。
#include"string.h"
#include"math.h"
int main()
{
char a[13];
char a0[1000][12];
char a1[1000][12];
char a2[1000][12]; //定义数组足够大,以至于能够保存足够多的数据,此方法极傻。
int i,j,k,s,x,y,z,a01,a11,a21,t1,t2,t3;
a01=a11=a21=0;
for(i=0; i<10; i++)
{
a0[i][0]='0';
a0[i][1]='\0';
a1[i][0]='0';
a1[i][1]='\0';
a2[i][0]='0';
a2[i][1]='\0';
}//若数据不足10个,则要输出0,博主在此先将前10个数据赋值为0,为下续更好判断
a0[10][0]='1';
a1[10][0]='1';
a2[10][0]='1';
while(~scanf("%d%s",&x,a))//一直输入直到文件尾,或者自行结束
{
if(x==0)//分情况保存至不同数组
strcpy(a0[a01++],a);
else if(x==1)
strcpy(a1[a11++],a);
else if(x==2)
strcpy(a2[a21++],a);
/* if(a01==10)
a01=0;
if(a11==10)
a11=0;
if(a21==10)
a21=0;*/
}
t1=a01-1;//此为后续判断是有10个数据
t2=a11-1;
t3=a21-1;
if(a0[9][0]=='0'&&a0[10][0]=='1')//若不足10个则先置换位置
for(i=0,a01--; i<a01; i++,a01--)
{
strcpy(a,a0[i]);
strcpy(a0[i],a0[a01]);
strcpy(a0[a01],a);
}
if(a1[9][0]=='0'&&a1[10][0]=='1')
for(i=0,a11--; i<a11; i++,a11--)
{
strcpy(a,a1[i]);
strcpy(a1[i],a1[a11]);
strcpy(a1[a11],a);
}
if(a2[9][0]=='0'&&a2[10][0]=='1')
for(i=0,a21--; i<a21; i++,a21--)
{
strcpy(a,a2[i]);
strcpy(a2[i],a2[a21]);
strcpy(a2[a21],a);
}
for(i=0; i<10; i++)//分情况输出,数据量大于10的和不大于10的
{
if(t1>=10)
printf("%s ",a0[t1-9+i]);
else
printf("%s ",a0[i]);
if(t2>=10)
printf("%s ",a1[t2-9+i]);
else
printf("%s ",a1[i]);
if(t3>10)
printf("%s ",a2[t3-9+i]);
else
printf("%s ",a2[i]);
}
}