1.原题:PTA | 程序设计类实验辅助教学平台
2.我的思路:
(1)应用结构体储存学生的信息,其中结构体包含对德分,才分,总分和学生的分类。
(2)输入数据时剔除不及格的数据。
(3)满足条件的数据进行排序。
3.问题分析:
(1)一开始我认为先按总分排,再按德分排,再按准考证号排会不会很麻烦。这里的解决方法是:自己写一个cmp函数来比较两个结构体。
(2)首先尝试了冒泡排序会导致超时,后来换成快速排序。
(3)结构体储存学号用字符数组容易出问题,参考一些资料后,发现字符数组比较时会比较字符数组的地址大小,所以过程中导致了在本地和oj上运行结果的不一样的问题,换成int后便成功排除该问题。
(4)为了让自己思路更清晰,本题我采用了设计函数,且让一个函数只需实现一个功能的写法,上学期听课时感觉这种写法能让自己思路更清晰,不会出现没一次性写完下次就不懂如何对之前代码下手的情况。但缺点是有点冗长,希望今后自己的代码能更加简明清晰。
#include<stdio.h>/
#include<string.h>
struct stu{
int no;
int de;
int cai;
int sum;
int type;
};//定义存学生信息的结构体
long int getData(struct stu *data,long int size,int low,int high);
void output(struct stu *data ,long int size);
void qsort(struct stu *data, long int begin ,long int end);
int cmp(struct stu i, struct stu j);
int main(void)
{
long int N,n;
int L,H;
//设学生数,最低线,优先线,结构体数组
scanf("%ld%d%d",&N,&L,&H);
getchar();
struct stu arr[N];
n=getData( arr , N , L , H);//输入德才均达到L的数据,n为计数
qsort( arr , 0 , n-1);
output( arr , n);
return 0;
}
long int getData(struct stu *data,long int size,int low,int high)
{
long int i,count=0;
int tno;
int tde,tcai;
for(i=0;i<size;i++){
scanf("%d %d %d",&tno,&tde,&tcai);
if(tde>=low&&tcai>=low){
if(tde>=high&&tcai>=high) data[count].type=1;
else if(tde>=high&&tcai<high) data[count].type=2;
else if(tde>=tcai) data[count].type=3;
else data[count].type=4;
data[count].no=tno;
data[count].de=tde;
data[count].sum=tde+tcai;
data[count++].cai=tcai; //data[count++]为先使用值,再进行count+1;
}
}
return count;
}
void output(struct stu *data ,long int size)
{
long int i;
printf("%ld\n",size);
for( i=0 ;i<size;i++){
printf("%d %d %d\n",data[i].no,data[i].de,data[i].cai);
}
}
int cmp(struct stu i, struct stu j) //类型,总分,德分,才分,准考证号依次按题目要求比较
{
if(i.type>j.type) return 0;
else if(i.type<j.type) return 1;
else if(i.sum>j.sum) return 1;
else if(i.sum<j.sum) return 0;
else if(i.de>j.de) return 1;
else if(i.de<j.de) return 0;
else if(i.no<j.no) return 1;
else if(i.no>j.no) return 0;
else return 1;
}
void qsort(struct stu *data, long int begin ,long int end) //快速排序
{
if(begin > end) return;
struct stu tmp=data[begin];
long int i=begin;
long int j=end;
while(i!=j){
while(cmp(tmp,data[j])&&j>i) j--;
while(cmp(data[i],tmp)&&j>i) i++;
if(j>i){
struct stu t=data[i];
data[i]=data[j];
data[j]=t;
}
}
data[begin]=data[i];
data[i]=tmp;
qsort(data,begin,i-1);
qsort(data,i+1,end);
}