分班问题 、幼儿园分班(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

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring