L1-030 一帮一C语言

本文介绍了一种算法,用于自动将学习成绩优异的学生与成绩较弱的异性同学组成学习小组,以促进班级内的互助学习。算法通过单遍for循环实现了高效的学生配对。

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

输入第一行给出正偶数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语言单遍for循环实现输出

#include<stdio.h>
main()
{
    int numstudent,i,num;
    int boy[25],girl[25],sex[50],*ptob=boy,*ptog=girl;
    char name[50][9];
    scanf("%d",&numstudent);
    for(i=0;i<numstudent;i++){
        scanf("%d %s",&sex[i],name[i]);
        if(sex[i]){
            *ptob++=i;
        }else{
            *ptog++=i;
        }
    }
    num=numstudent/2;
    for(i=0;i<num;i++){
        printf("%s %s\n",name[i],name[sex[i]?*(--ptog):*(--ptob)]);
    }
}
“L1 - 030 一帮”问题是要编写程序帮助老师完成“一帮学习小组”的分配工作,即把学习成绩靠前的学生跟学习成绩靠后的异性学生分为组。以下是几种相关的C语言实现方案: ### 方案 ```c #include<stdio.h> struct student { int sex; char name[9]; }stu[50]; int main() { int N,i,j; scanf("%d",&N); for(i=0;i<N;i++) { scanf("%d %s",&stu[i].sex,&stu[i].name); } for(i=0;i<N;i++) { for(j=N-1;j>=i;j--) { if(stu[i].sex!=stu[j].sex&&stu[j].sex!=5) { printf("%s %s\n",stu[i].name,stu[j].name); stu[j].sex=5; break; } } } return 0; } ``` 此方案通过结构体数组`student`存储学生的性别和姓名,然后通过两层循环为每个成绩靠前的学生寻找成绩靠后的异性学生进行分组,分组后将靠后学生的性别标记为`5`,避免重复分组 [^3]。 ### 方案二 ```c #include<stdio.h> int main() { int k,i,j,s[51]={0},f[51]={0}; char n[50][9]; scanf("%d",&k); for(i=0;i<k;i++) { scanf("%d %s",&s[i],n[i]); } for(i=0;i<k;i++) { for(j=k-1;j>=0;j--) { if(s[i]!=s[j]&&f[i]==0&&f[j]==0) { printf("%s %s\n",n[i],n[j]); f[i]=f[j]=1; } } } return 0; } ``` 该方案使用数组`s`存储学生性别,数组`n`存储学生姓名,数组`f`标记学生是否已分组。通过两层循环为每个未分组的成绩靠前的学生寻找未分组的成绩靠后的异性学生进行分组,分组后将两人标记为已分组 [^4]。 ### 方案三 ```c #include<stdio.h> typedef struct stu//创建结构体,并将结构体命名为stu { int id;//成绩排名 int sex;//性别 char name[20];//姓名 }stu; int main() { stu ss[50];//创建结构体数组 int num;//总人数 scanf("%d", &num);//输入总人数 for (int i = 0; i < num; i++) {//循环写入结构体数组 scanf("%d%s", &ss[i].sex, &ss[i].name); ss[i].id = i + 1;//排名名次 } for (int i = 0; i < num / 2; i++) {//循环排名的上半部分 if (ss[i].sex == 0) {//性别为0的做以下循环 for (int j = num-1; j >= num / 2; j--) {//循环排名的下半部分 if (ss[j].sex == 1) {//性别等于1的 printf("%s %s\n", ss[i].name, ss[j].name);//输出组合成功的两人姓名 ss[j].sex = 3;//将匹配成功的下半部分人的性别改为其他字符 break;//匹配成功跳出循环 } } } else { for (int j = num - 1; j >= num / 2; j--) { if (ss[j].sex == 0) { printf("%s %s\n", ss[i].name, ss[j].name); ss[j].sex = 3; break; } } } } } ``` 此方案定义了结构体`stu`存储学生的排名、性别和姓名,使用结构体数组`ss`存储所有学生信息。通过两层循环,外层循环遍历成绩排名靠前的学生,内层循环从成绩靠后的学生中寻找异性学生进行分组,分组后将靠后学生的性别标记为`3` [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值