已知有n个考生,按成绩录取 m个
首先这个题目肯定涉及到一个排序问题.然后来分析一下这个题目.
1,题目给定了m,n都是未知数据,那么这题的m,n要由scanf来输入了.然后分析下解决问题的核心.录取前m个,那么这前m个同学和他们的成绩肯定是一一对应的,可近似的将这几个同学编号,给定一个序号,这个序号就对应着他们的成绩,然后对成绩进行排序,录取前m名.
2;既然有序号,那么将序号作为数组名,数组的具体值作为他们的成绩,这样按照成绩排列的同时,也将他们的序号也进行了按成绩进行现后排序.
3:最关键的问题是,数组是一个容器,当我对数组排序的时候,假如用交换的思想,那么数组排序是轻而易举,但是你数组所对应的值也会发生改变,所以这种方法是行不通的.
4:所以说不仅要排序,还得使用一种方法去记录数组原有的值,及对应的序号.所以小编使用了两个相同的数组,来解决这个问题.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned)time(NULL));
int m,n,i,k,p,grade;
printf("请输入考生数目,m为录取考生数量") ;
scanf("%d %d",&n,&m);
int a[n];//n为考号,a[n]的值为成绩;
int b[n];
for(i=0;i<n;i++)
a[i]=rand()%40;//生成成绩随机,将40换成其他数即可改变成绩取值范围.
for(i=0;i<n;i++)
{
b[i]=a[i];//生成两个相同数组.
printf("%d ",b[i]);
}
if(a[0]<a[1])
{
k=a[0];
a[0]=a[1];
a[1]=k;
}
for(i=2;i<n;i++)
{
for(k=i;k>0;k--)
{
if(a[k]>a[k-1])
{
p=a[k-1];
a[k-1]=a[k];
a[k]=p;
}
}
}//对数组进行了交换,用了一个小小的分类讨论,也可以直接交换.
printf("\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
printf("分数线为%d\n",a[m-1]);//找到对数据进行处理,从小到大排序,找到第m名的成绩,为后面的筛选做准备.
p=0;
for(i=0;i<m;i++)
{
for(k=0;k<n;k++)
{
if(b[k]==a[i])
{
p++;
printf("该考生考号为%d 该考生成绩为%d\n",k,a[i]);//排好顺序后,返回原数组,因为原数组中成绩与序号一一对应,我可以从成绩入手,找出对应的序号,这样就解决了排序的问题.
}
if(p==m)
break;//如果将第一个break删掉则可以录取跟分数线所有同分的同学,人性化一点,但是小编加上了,因为小编目的是解决问题,不是去考虑实际情况,加上了好说明.
}
if(p==m)
break;
}
}
由于后面的一系列注释是脱离代码再写稿的时候加上去的所以如果运行出现问题可以将注释全都删掉,再运行试试看.
小编也是初学者如果有什么问题,欢迎在评论区一起讨论.