#include<stdio.h>;
#include<string.h>;
#include<stdlib.h>;
struct student
{
char name[100];
int num[1000];
int score;
};
int compare1(const void *a,const void *b)
{
return ((student*)b)->score – ((student*)a)->score;
}
int compare2(const void *a,const void *b)
{
return *(((student*)a)->name) – *(((student*)b)->name);
}
void print(student s)
{
printf(“%s %d\n”, s.name, s.score);
}
int main()
{
student s[1000];
student ne[1000];
int n,m,g;
int t;
int a[1000];
int i,j;
while(scanf(“%d%d%d”,&n,&m,&g)!=EOF)
{
for(i=0;i<m;i++)
{
scanf(“%d”,&a[i]);
}
for(i=0;i<n;i++)
{
scanf(“%s%d”,s[i].name,&t);
getchar();
for(j=0;j<t;j++)
{
scanf(“%d”,&s[i].num[j]);
}
}
int p=0;
int r[1000]={0};
for(i=0;i<n;i++)
{
s[i].score=0;
for(j=0;j<t;j++)
{
s[i].score+=a[s[i].num[j]-1];
}
int k=0;
if(s[i].score>=g)
{
//memcpy(ne[p],s[i],sizeof(s[i]));
strcpy(ne[p].name,s[i].name);
ne[p].score=s[i].score;
p++;
}
}
qsort(ne, p, sizeof(student), compare2);
qsort(ne, p, sizeof(student), compare1);
printf(“%d\n”,p);
for(i = 0; i < p; i++)
{
print(ne[i]);
}
}
return 0;
}
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
#include<string.h>;
#include<stdlib.h>;
struct student
{
char name[100];
int num[1000];
int score;
};
int compare1(const void *a,const void *b)
{
return ((student*)b)->score – ((student*)a)->score;
}
int compare2(const void *a,const void *b)
{
return *(((student*)a)->name) – *(((student*)b)->name);
}
void print(student s)
{
printf(“%s %d\n”, s.name, s.score);
}
int main()
{
student s[1000];
student ne[1000];
int n,m,g;
int t;
int a[1000];
int i,j;
while(scanf(“%d%d%d”,&n,&m,&g)!=EOF)
{
for(i=0;i<m;i++)
{
scanf(“%d”,&a[i]);
}
for(i=0;i<n;i++)
{
scanf(“%s%d”,s[i].name,&t);
getchar();
for(j=0;j<t;j++)
{
scanf(“%d”,&s[i].num[j]);
}
}
int p=0;
int r[1000]={0};
for(i=0;i<n;i++)
{
s[i].score=0;
for(j=0;j<t;j++)
{
s[i].score+=a[s[i].num[j]-1];
}
int k=0;
if(s[i].score>=g)
{
//memcpy(ne[p],s[i],sizeof(s[i]));
strcpy(ne[p].name,s[i].name);
ne[p].score=s[i].score;
p++;
}
}
qsort(ne, p, sizeof(student), compare2);
qsort(ne, p, sizeof(student), compare1);
printf(“%d\n”,p);
for(i = 0; i < p; i++)
{
print(ne[i]);
}
}
return 0;
}
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
解决方案:40分
static student s[1000];
static student ne[1000];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
static student ne[1000];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。