代码编织梦想

复试筛选

问题描述
考研初试成绩公布后需要对m个学生的成绩进行排序,筛选出可以进入复试的前n名学生。
排序规则为首先按照总分排序,总分相同则按英语单科成绩排序,总分和英语成绩也相同时考号小者排在前面。
现给出这m个学生的考研初试成绩,请筛选出可以进入复试的n名学生并按照排名从高到低的顺序依次输出。

输入说明
输入为m+1行,第一行为两个整数m和n,分别表示总人数和可以进入复试人数,m和n之间用空格分隔,0<n<m<200。
接下来为m行数据,每行包括三项信息,分别表示一个学生的考号(长度不超过20的字符串)、总成绩(小于500的整数)和英语单科成绩(小于100的整数),这三项之间用空格分隔。

输出说明
按排名从高到低的顺序输出进入复试的这n名学生的信息。

输入样例

5 3
XD20160001 330 65
XD20160002 330 70
XD20160003 340 60
XD20160004 310 80
XD20160005 360 75

输出样例

XD20160005 360 75
XD20160003 340 60
XD20160002 330 70

#include<stdio.h>
#include<string.h>
#include<math.h>
#define DIGIT 8
int main()
{
/**************************函数参数********************************************
*num							学生人数 
*count							录取人数 
*xlong 							学生id长度 
*id[200][20],xid[200][20]		学生id,学生id后若干位倒置 
*total[200],eng[200],xxid[200]	总分,英语分数,id后若干位 
*i,j,k,l 						临时变量 
*xchang							临时数组变量 
*DIGIT							宏定义,表示数组后面若干位 
*******************************************************************************/
	/*定义*/
	int num,count,xlong;
	char id[200][20],xid[200][20],xchang[200];
	int total[200],eng[200],xxid[200];
	int i,j,k,l;
	
	/*输入*/
	scanf("%d%d",&num,&count);
	getchar();
	for(i=0;i<num;i++){
		getchar();
		scanf("%s %d%d",id[i],&total[i],&eng[i]);
	}	
		
	/*初始化*/
	k=0;
	for(i=0;i<num;i++)		   
		xxid[i]=0;
		  
	/*求id的长*/	
	xlong=strlen(id[0]);
	
	/*倒置id的后几位*/ 
	for(j=0;j<num;j++)
		for(i=0;i<DIGIT;i++)
			xid[j][i]=id[j][xlong-1-i];
	for(j=0;j<num;j++)		
		xid[j][DIGIT]='\0';

	/*将字符数字转化整形数字*/	
	for(i=0;i<num;i++){
		for(j=0;j<DIGIT;j++)
			xxid[k]=xxid[k]+(xid[i][j]-48)*pow(10,j);
		k++;
	}

	/*排序*/						
	for(i=0;i<num-1;i++)
		for(j=i;j<num;j++){
			if(total[i]<total[j]){
				l=total[i];
				total[i]=total[j];
				total[j]=l;
				l=eng[i];
				eng[i]=eng[j];
				eng[j]=l;
				strcpy(xchang,id[i]);
				strcpy(id[i],id[j]);
				strcpy(id[j],xchang);
			}
			else if(total[i]==total[j]){
				if(eng[i]<eng[j]){
					l=total[i];
					total[i]=total[j];
					total[j]=l;
					l=eng[i];
					eng[i]=eng[j];
					eng[j]=l;
					strcpy(xchang,id[i]);
					strcpy(id[i],id[j]);
					strcpy(id[j],xchang);
				}
				else if(eng[i]==eng[j]){
					//if(xxid[i]<xxid[j]){		就这里傻了,哎!!!
					if(xxid[i]>xxid[j]){
						l=total[i];
						total[i]=total[j];
						total[j]=l;
						l=eng[i];
						eng[i]=eng[j];
						eng[j]=l;
						strcpy(xchang,id[i]);
						strcpy(id[i],id[j]);
						strcpy(id[j],xchang);
					}
				}
			}
		}
		
	/*打印*/ 
	for(i=0;i<count;i++)
		printf("%s %d %d\n",id[i],total[i],eng[i]);			  
			
	return 0; 
} 
 @ RoboMaster!十兮

行了,别抄了,这份代码我提交上去只能对一半,至于为啥,我也不知道,至今还没有找到错误……要是有那位大神能替我找到错误的,那就非常感谢了
还是那句话,等我成大神了,我就回来看看。。。
希望各位找到错误的能及时告知!!!
(2020.12.14)
好了,现在找到错误了,纯属自己傻了,不仔细,学号小的排在前面,我给搞反了…………代码现在能用了……啥时候有空我再来化简。。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/m0_51187138/article/details/111096847

文件排序-爱代码爱编程

文件排序 问题描述 操作系统中在查找文件时会按照某个规则对文件排序,例如下图为按照文件修改日期逆序排序(最后修改的排在最前面)。 但目前操作系统不支持同时按照多个字段进行排序。现在请你写一个程序能够同时按照修改日期和文件大小对文件进行排序,排序规则为: 日期优先,最后修改的排在前面当修改日期相同时,大的文件排在前面输入说明 第一行为一个数字n,n 表示

C语言 互换最大最小值-爱代码爱编程

是新手写的代码。 发上来是希望以后能回看自己的进步过程,同时把这里当成一个电子笔记本,收集题目。 肯定会有很多不足之处,希望大家多多指出错误(促进共同进步鸭 互换最大最小值 利用函数Swap(),从键盘输入10个整数,用函数编程实现寻找最大值和最小值,并互换它们所在数组中的位置。 下标法(乱起的名字) #include <stdio.h>

C语言括号匹配不用栈思路(考虑左右匹配)-爱代码爱编程

问题描述 表达式中的合法括号为“(”、“)”、“[”、“]”、“{”、“}”,这三种括号可以按照任意的次序嵌套使用。 请写一个程序,判断给定表达式中的括号是否匹配,既左右括号顺序和数量都匹配。 输入说明 输入为一个表达式字符串,长度不超过50。 输出说明 对输入的表达式,若其中的括号是匹配的,则输出“yes”,否则输出“no”。 !!!注意,这

2020-12-13-爱代码爱编程

DSP使用心得之TMS320C6713的启动方式 本文重点介绍C6713的启动方式,如有错误,望不吝赐教。 一、离线启动方式 C6713的启动方式不同于C6747\48及C6455等DSP的启动方式,EDMA自动将CE1起始位置1KB代码拷贝到内部程序存储器的0地址中,拷贝完成后程序由0地址开始运行,这个过程由内置固件自动完成,可称为一级引导BOOT。这

成绩转换(switch循环)-爱代码爱编程

成绩转换(switch循环) #include<stdio.h> int main() { int n; printf("please input grades\n"); scanf("%d",&n); if(n>=0&&n<=59) n=1; if(n>=60&&n&l

c语言实现时间片轮转调度算法-爱代码爱编程

#include <stdio.h>//引入输入输出流文件 #include <stdlib.h> struct PCB { int pid;//进程标识符 int rr;//已运行时间 int time;//进程要求运行时间 char sta;//进程的状态 struct PCB *next;//链接指针 }; struct PC