C语言代码:自动分组学生,实现“一帮一学习小组”

问题描述: “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式: 输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式: 每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

输出样例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

思路: 由于要按照名次从高到低分配,所以我们可以将学生按照名次从高到低存储在一个结构体数组中,这样可以方便后面的操作。然后依次遍历结构体数组,如果该学生还没有被分组,就与他后面第一个未分组的异性学生配对,然后打标记表示这两个学生已经被分组了。最后按照名次从高到低输出所有的小组即可。

**注意:**题目中要求分组的是异性学生,因此我们需要保存当前未分组的最后一个男生和女生的位置,这样可以方便后面的操作。

C语言 代码:

#include <stdio.h>
#include <string.h>

#define MAX_NUM 50

struct Student {
    int gender; // 0: female, 1: male
    char name[9];
    int group;  // 0: not grouped, 1: grouped
};

int main() {
    int n, i;
    struct Student students[MAX_NUM];
    int last_male = -1, last_female = -1;

    scanf('%d', &n);
    for (i = 0; i < n; i++) {
        scanf('%d %s', &students[i].gender, students[i].name);
        students[i].group = 0;  // 初始化所有学生为未分组
    }

    for (i = 0; i < n; i++) {
        if (students[i].group == 0) { // 如果该学生未分组
            if (students[i].gender == 0) { // 女生
                if (last_male != -1) { // 如果有未分组的男生
                    printf('%s %s
', students[i].name, students[last_male].name);
                    students[i].group = 1;
                    students[last_male].group = 1;
                    last_male = -1; // 更新最后一个未分组的男生位置
                }
                else {
                    last_female = i; // 记录最后一个未分组的女生位置
                }
            }
            else { // 男生
                if (last_female != -1) { // 如果有未分组的女生
                    printf('%s %s
', students[i].name, students[last_female].name);
                    students[i].group = 1;
                    students[last_female].group = 1;
                    last_female = -1; // 更新最后一个未分组的女生位置
                }
                else {
                    last_male = i; // 记录最后一个未分组的男生位置
                }
            }
        }
    }

    return 0;
}

代码解释:

  1. **结构体定义:**定义一个名为 Student 的结构体,包含学生的性别、姓名和分组状态。
  2. **输入数据:**使用 scanf 函数输入学生人数和每个学生的性别和姓名,并将数据存储在 students 数组中。
  3. **分组逻辑:**使用循环遍历 students 数组,如果当前学生未分组,则判断其性别:
    • 如果是女生,则查找最后一个未分组的男生,如果找到则配对并标记为已分组,否则记录当前女生为最后一个未分组的女生。
    • 如果是男生,则查找最后一个未分组的女生,如果找到则配对并标记为已分组,否则记录当前男生为最后一个未分组的男生。
  4. **输出结果:**根据分组结果,按名次从高到低输出所有的小组。

注意: 代码中使用了 last_malelast_female 变量来记录最后一个未分组的男生和女生的位置,以便在配对时快速查找。

希望这个代码能够帮助你实现自动分组功能!

C语言代码:自动分组学生,实现“一帮一学习小组”

原文地址: https://www.cveoy.top/t/topic/oPIw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录