1015 德才论 C语言

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值