新手求救 9AC1WA 测试数据n为180时出错输出数据看不出问题(哭了)

P1093 [NOIP2007 普及组] 奖学金

像素旋转 @ 2020-12-31 20:55:27


#include<string.h>
typedef struct student
{int num;
 int chi;
 int math;
 int eng;
 int sum;
 char str[13];
}STU;
void string(STU*,int,int,int,int);
void reverse(char *,char *);
int main(void)
{int n,i,j;
STU stu[300]={0},*p=stu,temp,*q=NULL;
scanf("%d",&n);
for(i=1;i<=n;i++,p++)
{p->num=i;
scanf("%d%d%d",&p->chi,&p->math,&p->eng);
p->sum=p->chi+p->eng+p->math;
string(p,p->sum,p->chi,p->math,p->eng);
}
for(i=0;i<n-1;i++)
    for(p=stu;p<stu+n-1-i;p++)
    {
        if(strcmp(p->str,(p+1)->str)<0)
    {temp=*p;
     *p=*(p+1);
     *(p+1)=temp;
    }   
    }
    for(p=stu;p<stu+5;p++)
        printf("%d %d\n",p->num,p->sum);

getchar();
getchar();
return 0;
}
void string(STU* p,int sum,int chi,int math,int eng)
{ char a[13]={0},*m,*n;
int cnt=0;
m=&a[cnt];
    while(sum)
    {a[cnt++]=(char)(48+sum%10);
    sum/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    m=&a[cnt];
    while(chi)
    {   a[cnt++]=(char)(48+chi%10);
    chi/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    m=&a[cnt];
    while(math)
    {   a[cnt++]=(char)(48+math%10);
    math/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    m=&a[cnt];
    while(eng)
    {   a[cnt++]=(char)(48+eng%10);
    eng/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    a[cnt]='\0';
    strcpy(p->str,a);
}
void reverse(char*m,char*n)
{char *p,*q,temp;
  for(p=m,q=n;p<q;p++,q--)
  {temp=*p;
  *p=*q;
  *q=temp;
  }
}

by 空格人 @ 2020-12-31 21:01:59

建议呢,数组开大点,毕竟只错一个点,我也没细看


by 空格人 @ 2020-12-31 21:03:17

还有,为什么奖学金都有指针巨佬啊,看不懂指针瑟瑟发抖


by Jiao_Xie @ 2020-12-31 21:06:43

看不懂指针瑟瑟发抖


by 像素旋转 @ 2021-01-01 12:19:19


#include<string.h>
typedef struct student
{int num;
 int chi;
 int math;
 int eng;
 int sum;
 char str[13];
}STU;
void string(STU*,int,int);
void reverse(char *,char *);
int main(void)
{int n,i,j;
STU stu[300]={0},*p=stu,temp,*q=NULL;
scanf("%d",&n);
for(i=1;i<=n;i++,p++)
{p->num=i;
scanf("%d%d%d",&p->chi,&p->math,&p->eng);
p->sum=p->chi+p->eng+p->math;
string(p,p->sum,p->chi);
}
for(i=0;i<n-1;i++)
    for(p=stu;p<stu+n-1-i;p++)
    {
        if(strcmp(p->str,(p+1)->str)<0)
    {temp=*p;
     *p=*(p+1);
     *(p+1)=temp;
    }   
    }
    for(p=stu;p<stu+5;p++)
        printf("%d %d\n",p->num,p->sum);

getchar();
getchar();
return 0;
}
void string(STU* p,int sum,int chi)
{ char a[13]={0},*m,*n;
int cnt=0;
m=&a[cnt];
    while(sum)
    {a[cnt++]=(char)(48+sum%10);
    sum/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    m=&a[cnt];
    while(chi)
    {   a[cnt++]=(char)(48+chi%10);
    chi/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    /*m=&a[cnt];
    while(math)
    {   a[cnt++]=(char)(48+math%10);
    math/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);
    m=&a[cnt];
    while(eng)
    {   a[cnt++]=(char)(48+eng%10);
    eng/=10;
    }
    n=&a[cnt-1];
    reverse(m,n);*/
    a[cnt]='\0';
    strcpy(p->str,a);
}
void reverse(char*m,char*n)
{char *p,*q,temp;
  for(p=m,q=n;p<q;p++,q--)
  {temp=*p;
  *p=*q;
  *q=temp;
  }
}```
回去看过题目发现只要比总分和语文然后改了一下但是测试点8依旧没过

by 像素旋转 @ 2021-01-01 12:21:29

@空格人 我之前题目看错了是只比总分和语文就行了,改完后数组肯定够大了,但依旧1WA


|