分班问题 、幼儿园分班(C语言)

2024-02-23 06:04
文章标签 语言 问题 分班 幼儿园

本文主要是介绍分班问题 、幼儿园分班(C语言),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

幼儿园两个班的小朋友排队时混在了一起,每个小朋友都知道自己跟前面一个小朋友是不是同班,请你帮忙把同班的小朋友找出来
小朋友的编号为整数,与前面一个小朋友同班用Y表示,不同班用N表示

输入

输入为空格分开的小朋友编号和是否同班标志
比如 6/N 2/Y 3/N 4/Y
表示一共有4位小朋友
26是同班,32不同班,43同班
小朋友总数不超过999
0 < 每个小朋友编号 < 999
不考虑输入格式错误

输出

每一行记录一班小朋友的编号 编号用空格分开
并且

  1. 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行
  2. 如果只有一个班的小朋友 第二行为空
  3. 如果输入不符合要求输出字符串ERROR

示例一

输入

1/N 2/Y 3/N 4/Y
1

输出

1 2
3 4
12

说明

2的同班标记为Y因此和1同班
3的同班标记位N因此和1,2不同班
4的同班标记位Y因此和3同班

示例二

输入

1/N 2/Y 3/N 4/Y 5/Y

输出

1 2
3 4 5

思路

解题思路:

  1. 读取输入:首先通过fgets函数获取用户输入的一行字符串,然后使用strtok函数将其按照空格分割成一个个包含编号和是否同班标志的token(例如:“1/N”、"2/Y"等),并将这些token存入临时数组中。

  2. 初始化学生结构体数组:根据临时数组中的信息,利用sscanf函数将每个token解析为小朋友的编号(id)和是否同班(isClass)标志,并存储到Students结构体数组stu中。

  3. 判断首位合法性:检查首位小朋友是否与前一位小朋友同班。由于没有前一位小朋友,若首位标记为“Y”,则输入非法,输出"ERROR"并结束程序。

  4. 分配班级:遍历整个stu数组,对于每个小朋友:

    • 首位小朋友直接划归到班级1;
    • 若当前小朋友与前一位小朋友同班,则将其划归到前一位所在的班级;
    • 若当前小朋友与前一位小朋友不同班,则将其划归到另一个班级。

    在这个过程中,用两个整数数组class1class2分别记录两个班级的小朋友编号。

  5. 排序输出:对两个班级数组进行升序排序,这里使用C标准库提供的qsort函数进行快速排序。最后分别输出两个班级的小朋友编号,每个编号后面跟一个空格,第二个班级结束后输出换行符。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000// 定义学生结构体,包含小朋友编号(id)、是否同班标志(isClass)以及所在班级(classId)
typedef struct {int id;char isClass[2];int classId; // 表示小朋友属于一班还是二班
} Students;// 自定义排序函数,用于对整数数组进行升序排序
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }int main() {char input[3000]; // 输入缓冲区,用于存储用户输入的数据// 读取一行用户输入,并移除末尾换行符fgets(input, 3000, stdin);input[strcspn(input, "\n")] = '\0';// 使用strtok函数分割输入字符串为一个个token(小朋友编号和是否同班标志)char *token = strtok(input, " ");char tmp[MAX][10]; // 临时存储每个tokenint count = 0;     // 记录当前读取到的token数量while (token != NULL) {strcpy(tmp[count++], token); // 将token复制到临时数组中token = strtok(NULL, " ");   // 继续获取下一个token}// 初始化学生结构体数组,并将读取到的信息存入其中Students stu[MAX];for (int i = 0; i < count; i++) {sscanf(tmp[i], "%d/%s", &stu[i].id, stu[i].isClass);}// 检查首位小朋友是否与前一位小朋友同班(实际上没有前一位),若同班则输入非法,输出ERRORif (strcmp(stu[0].isClass, "Y") == 0) {printf("ERROR\n");return 0;}// 定义两个数组分别存储两个班级的小朋友编号int class1[MAX], class2[MAX];int count1 = 0, count2 = 0; // 分别记录两个班级的人数// 遍历所有小朋友信息,根据是否同班标志将他们分配到对应的班级数组中for (int i = 0; i < count; i++) {// 处理首位小朋友if (i == 0) {class1[count1++] = stu[i].id;stu[i].classId = 1; // 设置班级ID为1continue;}// 若当前小朋友与前一位小朋友同班,则将其划分到同一班级if (strcmp(stu[i].isClass, "Y") == 0) {stu[i].classId = stu[i - 1].classId;// 根据班级ID将小朋友编号添加到对应的班级数组中if (stu[i].classId == 1) {class1[count1++] = stu[i].id;} else if (stu[i].classId == 2) {class2[count2++] = stu[i].id;}}// 若当前小朋友与前一位小朋友不同班,则将其划分到另一个班级if (strcmp(stu[i].isClass, "N") == 0) {// 更新当前小朋友的班级ID,使其与前一位小朋友所在的班级不同if (stu[i - 1].classId == 1) {stu[i].classId = 2;} else if (stu[i - 1].classId == 2) {stu[i].classId = 1;}// 根据更新后的班级ID将小朋友编号添加到对应的班级数组中if (stu[i].classId == 1) {class1[count1++] = stu[i].id;} else if (stu[i].classId == 2) {class2[count2++] = stu[i].id;}}}// 对两个班级数组分别进行升序排序qsort(class1, count1, sizeof(int), cmp);qsort(class2, count2, sizeof(int), cmp);// 输出两个班级的小朋友编号,每个编号后面跟一个空格for (int i = 0; i < count1; i++) {printf("%d ", class1[i]);}printf("\n"); // 换行输出第二个班级for (int i = 0; i < count2; i++) {printf("%d ", class2[i]);}return 0;
}

文章目录

    • 题目
    • 输入
    • 输出
    • 示例一
      • 输入
      • 输出
      • 说明
    • 示例二
      • 输入
      • 输出
    • 思路
    • 代码

这篇关于分班问题 、幼儿园分班(C语言)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737725

相关文章

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)