一隻奮鬥的菜鳥的專欄
費了好長時間才做出這道題,開始是因為重定向忘了刪了,後來是那個編譯器支援但不能提交-------在結構體用自定義型別時提交失敗!!
要考慮下標問題,每個都要考慮是否後移,之間關係的判斷。。。。。
這裡採用sscanf()函式來收集輸入的數值,更方便!!!
#include<stdio.h>
#include<string.h>
struct xinxi
{
char name[12];
int num,time;
}st[1000];
int main()
{
int n,m,i,j,cout;
int len,sum,find,num,ctime,k,location;
char cname[12],degree[10];
cout=0;
scanf("%d%d",&n,&m); //n是考試題數
while(scanf("%s",cname)==1)
{
sum=0; cout++; k=n;//k儲存通過的題數
for(i=0;i<n;i++)
{
find=0; num=0;
scanf("%s",degree);
len=strlen(degree);
for(j=0;j<len;j++)
if(degree[j]=='(')
{
find=1;//此時AC且有錯
sscanf(degree,"%d(%d)",&ctime,&num);//ctime是提交用的時間,num是提交錯誤的次數
break;
}
if(find==0)
sscanf(degree,"%d",&ctime);
if(ctime<=0) //數值為負時進行下一個成績的輸入
{
k--;
continue;
}
sum+=ctime+(num*m);//將每個學生做題的總時間加在一起
//sum為總時間,k儲存通過的題數,cname為學生的姓名
}
//對st陣列進行賦值,cout儲存學生人數
location=0;
for(i=0;i<cout-1;i++)
{
if(k>st[i].num)//題數不等時
{
location=i; //插入陣列時的位置
break;
}
else if(k==st[i].num) //題數相等時
{
if(sum<st[i].time)
{
location=i;
break;
}
else if(sum==st[i].time)//時間相等
{
if(strcmp(cname,st[i].name)<0)
{
location=i;
break;
}
}
}
}
if(i==cout-1)
location=i;
//儲存
for(i=cout-2;i>=location;i--)
st[i+1]=st[i];
strcpy(st[i+1].name,cname);
st[i+1].num=k;
st[i+1].time=sum;
}
//輸出陣列
for(i=0;i<cout;i++)
{
printf("%-10s%3d%5d\n",st[i].name,st[i].num,st[i].time);
}
return 0;
}