已知有n名考生,按照成绩录取m名同学

已知有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;

 }

 }

由于后面的一系列注释是脱离代码再写稿的时候加上去的所以如果运行出现问题可以将注释全都删掉,再运行试试看.

小编也是初学者如果有什么问题,欢迎在评论区一起讨论.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,你可以使用结构体来存储每个学生的信息,包括姓和三科成绩。然后,你可以计算每个学生的总成绩,并将学生按照总成绩从高到低排输出。 下面是一个示例代码: ```c #include <stdio.h> #include <string.h> #define NUM_STUDENTS 3 #define NUM_SUBJECTS 3 struct student { char name[20]; int scores[NUM_SUBJECTS]; int total_score; }; void calc_total_score(struct student *s) { int i, sum = 0; for (i = 0; i < NUM_SUBJECTS; i++) { sum += s->scores[i]; } s->total_score = sum; } void print_students(struct student *students, int num_students) { int i, j; // 冒泡排序,按总成绩从高到低排 for (i = 0; i < num_students - 1; i++) { for (j = 0; j < num_students - i - 1; j++) { if (students[j].total_score < students[j + 1].total_score) { struct student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } // 输出排 for (i = 0; i < num_students; i++) { printf("%s: %d\n", students[i].name, students[i].total_score); } } int main() { struct student students[NUM_STUDENTS]; int i, j; // 输入学生信息和成绩 for (i = 0; i < NUM_STUDENTS; i++) { printf("请输入第%d学生的姓:", i + 1); scanf("%s", students[i].name); for (j = 0; j < NUM_SUBJECTS; j++) { printf("请输入%s的第%d科成绩:", students[i].name, j + 1); scanf("%d", &students[i].scores[j]); } calc_total_score(&students[i]); } // 输出排 print_students(students, NUM_STUDENTS); return 0; } ``` 这个示例代码首先定义了一个 `student` 结构体,包括学生的姓、三科成绩和总成绩。然后,它定义了两个函数,`calc_total_score` 函数用来计算学生的总成绩,`print_students` 函数用来按照总成绩输出学生信息。 在 `main` 函数中,它首先使用循环输入每个学生的信息和成绩,并计算每个学生的总成绩。然后,它调用 `print_students` 函数输出排。 希望这个示例代码可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值