PTA-C语言-结构体-一帮一

一、引言

在中小学的学习生活中,“一帮一学习小组” 这种组织方式特别常见,它能让学习成绩好的同学帮助成绩稍差的同学,促进大家共同进步。今天咱们就来讲讲如何通过编写程序,帮老师自动完成这个分组工作哦,让老师们能更轻松地安排学习小组呢。

二、题目要求解读

(一)输入要求
题目会先让我们输入一个正偶数 N(≤50),这个 N 就是全班学生的人数啦。然后呢,接下来会有 N 行信息,是按照名次从高到低的顺序给出每个学生的情况哦。每一行里包含了学生的性别(用 0 代表女生,1 代表男生)和姓名(注意啦,姓名是不超过 8 个英文字母的非空字符串),中间用 1 个空格隔开呢。而且这里还保证了本班男女比例是 1:1,也没有并列名次,这样就方便咱们进行分组啦。

(二)输出要求
输出就比较简单啦,每行要输出一组两个学生的姓名,中间用 1 个空格隔开哦。并且要保证名次高的学生在前,名次低的学生在后,小组的输出顺序也是按照前面学生的名次从高到低来排列的呢。

三、思路剖析(让思路更清晰易懂)

(一)整体思路
咱们要先把全班同学的信息都读取进来,这就用到结构体数组啦。然后呢,重点就是要把成绩好的同学和成绩差的异性同学分成一组哦。这里成绩好的同学输出顺序和读入顺序一样就行,所以用个 for 循环控制一下就好啦,循环条件就是 i < n/2 哦,因为是两两分组嘛,一半的同学就是成绩好的那部分啦。

(二)详细步骤

  1. 先输出成绩好的同学的名字
    这一步很简单呀,就在 for 循环里面直接用 printf 输出 stu [i].name 就行啦,这里 i 就是用来遍历成绩好的那部分同学的哦。

  2. 找到对应成绩差的同学并分组
    这里得分两种情况来看哦,一种是成绩好的同学是男同学,另一种就是成绩好的同学是女同学啦。

(1)当成绩好的同学是男同学时(stu [i].gender == 1)
咱们就要从输入的人名单中倒序去找对应的女同学啦,而且这个女同学还得是没组队的哦。怎么判断没组队呢?咱们在结构体里设置了一个 flag 变量呀,没组队就是 0,已经组队了就是 1。所以咱们要找的女同学得满足这三个条件哦:
条件 1:是女同学,也就是 stu [j].gender == 0;
条件 2:还没组队,也就是 stu [j].flag == 0;
条件 3:倒序找呀,所以循环条件是 int j = n - 1; j > 0; j--(这里要注意别让 j 越界哦,所以是 j > 0 而不是 j >= 0 呢)。
当找到符合这三个条件的女同学时,就把她的名字输出出来,然后把她的 flag 标记为 1,表示已经组队啦,最后别忘了用 break 跳出这个内层的 for 循环哦,因为已经找到合适的分组啦。

(2)当成绩好的同学是女同学时(stu [i].gender == 0)
和上面男同学的情况类似啦,也是要从人名单里倒序找没组队的男同学哦。同样要满足是男同学(stu [j].gender == 1)、没组队(stu [j].flag == 0)这几个条件,找到后输出名字、标记组队、跳出循环就行啦。

四、代码解析(逐行解读,让你更明白哦)

#include<stdio.h>
// 定义结构体student,用来存储每个学生的信息
struct student{
    char name[10];  // 用来存储学生的姓名,最多能存9个字符(因为有'\0'结尾符),但题目要求不超过8个英文字母
    int gender;     // 用来存储学生的性别,0代表女生,1代表男生
    int rank;       // 用来存储学生的名次,这里直接用循环变量i赋值就行啦,因为是按名次顺序读入的
    int flag;       // 用来标记学生是否已经组队,0表示未组队,1表示已组队
};

int main() {
    int n;
    scanf("%d",&n);
    getchar();  // 这里用getchar()是为了吸收掉输入n之后的换行符,避免影响后面的输入哦

    // 定义结构体数组stu,用来存储全班同学的信息
    struct student stu[n];

    // 循环读取每个学生的性别和姓名,并初始化rank和flag
    for(int i=0;i<n;i++){
        scanf("%d",&stu[i].gender);
        scanf("%s",stu[i].name);
        stu[i].rank=i;
        stu[i].flag=0;
    }

    // 开始分组啦,循环遍历成绩好的那一半同学(i < n/2)
    for(int i=0;i<n/2;i++) {
        // 先输出成绩好的同学的名字
        printf("%s ",stu[i].name);

        // 根据成绩好的同学的性别,分情况找对应的成绩差的同学并分组
        if(stu[i].gender==0){
            // 如果成绩好的同学是女同学,就从后往前找没组队的男同学
            for(int j=n-1;j>0;j--){
                if(stu[j].gender==1&&stu[j].flag==0){
                    printf("%s\n",stu[j].name);
                    stu[j].flag=1;
                    break;
                }
            }
        }else{
            // 如果成绩好的同学是男同学,就从后往前找没组队的女同学
            for(int j=n-1;j>0;j--){
                if(stu[j].gender==0&&stu[j].flag==0){
                    printf("%s\n",stu[j].name);
                    stu[j].flag=1;
                    break;
                }
            }
        }
    }
    return 0;
}

五、知识拓展

(一)结构体的灵活运用
在这个程序里,咱们用结构体把学生的多个信息(姓名、性别、名次、组队情况)整合到一起啦,这样处理起来就很方便哦。其实结构体在很多实际的编程场景中都特别有用呢。比如说,要是咱们要做一个图书管理系统,就可以用结构体来存储每本书的信息,像书名、作者、出版社、出版年份等等,然后通过对结构体数组的操作来实现图书的查询、借阅、归还等功能呀。

(二)循环的嵌套使用
这里咱们看到了 for 循环的嵌套哦,外层的 for 循环用来遍历成绩好的同学,内层的 for 循环用来在剩下的同学里找合适的分组对象。在其他编程任务中,循环嵌套也很常见哦。比如在处理二维数组的时候,通常就会用到两层 for 循环,一层用来遍历行,另一层用来遍历列,这样就能访问到二维数组里的每一个元素啦。

(三)条件判断的重要性
在找合适的分组对象时,咱们设置了好几个条件来判断哦,像性别条件、组队情况条件等等。在实际编程中,准确地设置条件判断是非常关键的呢。比如说在一个游戏开发中,要判断一个角色是否能进入某个区域,就可能要考虑角色的等级、是否拥有特定道具、当前的任务状态等等多个条件,只有当所有条件都满足时,角色才能进入那个区域哦。

希望通过这次的讲解,大家对这个 “一帮一学习小组” 自动分组程序的编写有了更清楚的了解,也能在以后的编程中更好地运用这些知识哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值