1. 程式人生 > >一隻奮鬥的菜鳥的專欄

一隻奮鬥的菜鳥的專欄

費了好長時間才做出這道題,開始是因為重定向忘了刪了,後來是那個編譯器支援但不能提交-------在結構體用自定義型別時提交失敗!!

要考慮下標問題,每個都要考慮是否後移,之間關係的判斷。。。。。

 這裡採用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;
}