【头歌C语言程序设计】结构体解答

news2024/9/20 22:51:03

写在前面

这道题总体来说还是偏难的,如果只看代码比较难以理解,当结构体的文章发出后,就有许多小伙伴问我这个问题,我开始意识到,可能我对这道题所作的解答还不够(不装了😁,根本没有解答),所以我又回头看了看这道题,下面是我的一些个人理解,希望对各位小伙伴有帮助。


没看懂题目?

在这里插入图片描述

目的就是统计生日相同的学生,并输出他们的信息。

在这里插入图片描述

  • 看输入部分。第一行是5,接下来5行,每一行都是学生学号、生日,这就很好办,不是难点,一个for循环就能搞定,**但是以何种形式存储才能在要处理时方便一些?**相信大家一定一头雾水,大家继续往下看…

  • 看输出部分。第一行是生日+两个学号,第二行也是同样的生日+两个学号,这里就稍微有些棘手了,**怎样让生日相同的学生学号一并输出?**我们先按下不表


不清楚结构体?

看完了输入和输出部分,就剩中间最难的部分了,别急,先做好准备工作,我们来回答上面的第一个问题:以何种形式存储较好。
答:我们考的就是结构体当然就以结构题的形式来存储了,先声明这样一个的结构体类型,并同时定义一个结构体数组stu[50]可以用来存放50个学生的信息,我称其为输入数组

在这里插入图片描述

第二个结构体类型又是怎样一回事呢?

在这里插入图片描述

这时我们就可以回答上面的第二个问题:怎样让生日相同的学生学号一并输出?

  • 答:相信你能猜到char ids[50][6]的作用了,没错这就是用来存生日相同的学生的五位学号+'\0’的。例如,1月10日有两位学生生日相同,将他们的学号分别存入bir[0].ids[0]和bir[0].ids[1]中,第二个结构体数组,我称之为输出数组。

  • 学的好的话,bir[50]={ 0 },就会知道我们把初始的50个数组中的nums全部赋初值为0,

  • 这里面的nums相当于一个计数器,用来记录生日相同的学生有几个,如果有生日相同的学生,num就+1。


不理解变量含义?

n 用来存储学生个数
i , j 主要用于循环变量
k 用来记录输出数组中生日不相同的学生数量,例如输出数组中有四名学生,有三名生日都相同,则k就等于2

搞不懂执行情况?

好了,卖了这么多的关子,相信你已经对题目比较了解了。接下来看中间部分

在这里插入图片描述

结合实际例子可能比较容易理解,就按照题目给出的示例来解释。示例中n=5,所以就会执行5次大循环。

5
00001 1 10
00002 2 24
00003 1 10
00004 12 21
00005 12 21

  • 第一次大循环。 j = 0、k = 0,所以第一个小循环( for循环 )就不会执行了,继续下面看if(j == k),这个循环就可以执行,此时就会把第一个学生的信息( 00001 1 10 )由输入数组(stu[0])存进输出数组(bir[0]),顺带将num置为1,k置为1,第一次大循环结束。

  • 第二次大循环。 j = 0、k = 1,则进入第一个小循环( for循环 )且仅执行一次,判断第二位同学的生日( 00002 2 24 )和输入数组(stu[0])中学生生日不同。继续执行下面代码,此时 j = 1、k = 1,if(j == k)符合条件,此时就会把第二个学生的信息( 00002 2 24 )由输入数组存进输出数组中的第二个位置上( bir[1] ),顺带将第二个位置上的num置为1( bir[1].num = 1),k置为2,第二次大循环结束。

  • 第三次大循环,j = 0、k = 2,则进入第一个小循环( for循环 ),将第三位同学的生日( 00003 1 10)和输出数组中的两位同学生日( bir[0]和bir[1] )比较,判断出和输出数组中第一位同学生日相同( bir[0] ),就直接退出第一个小循环。此时 j = 0、k = 2,所以if(j == k)就不符合条件,执行else语句,将第三名同学( stu[2] )的学号存进输出数组( bir[0].ids[1],注意bir[0].ids[0]存的是第一位同学的学号 ),并将bir[0].num置为2。

  • 第四次大循环, j = 0、k = 2,则进入第一个小循环,判断输入数组中第四位( stu[3] )和输出数组中学生生日都不同,此时 j = 2、k = 2,所以if(j == k)符合条件,就把第四位同学的生日信息由输入数组存入输出数组(bir[3])中,并将num置为1,k置为3。第四次大循环结束。

  • 第五次大循环,j=0、k=3,则进入第一个小循环,将第五位同学的生日( 00003 1 10)和输出数组中的三位同学生日比较,判断和第三位同学( bir[2] )生日相同,就直接退出第一个小循环。此时j = 3、k = 3,if(j == k)符合条件,此时就会把第五个学生的信息( 00005 12 21 )由输入数组存进输出数组中的第三个位置上,顺带将第三个位置上的num置为2,k置为4,第五次大循环结束。


完整代码


#include <iostream>
using namespace std;
#include<string.h>
/**********   Begin   **********/
struct stuinfo //储存输入学生的信息,简称输入数组
{
    char id[6];
    int month;
    int day;
}stu[50];  //给50的空间是因为0<=n<50
 
struct birs //储存输出学生的信息,简称输出数组
{
    int nums;
    int month;
    int day;
    char ids[50][6];
}bir[50]={0};

void Count()
{
    int n,i,j,k=0;
    scanf("%d",&n);
    //输入n个学生信息
    for(i=0;i<n;i++)
        scanf("%s%d%d",stu[i].id,&stu[i].month,&stu[i].day);
  
    //处理
    for(i=0;i<n;i++)
    {
       //主要判断 输入数组 中的学生和 输出数组 中的每一个学生生日是否相同
        for(j=0;j<k;j++)
        {
            if(bir[j].month == stu[i].month && bir[j].day == stu[i].day)
                break;
        }
        
        //将不同生日的学生分开存放
        if(j==k)
        {
            bir[k].day = stu[i].day;
            bir[k].month = stu[i].month;
            strcpy(bir[k].ids[0],stu[i].id);
            bir[k].nums = 1;
            k++;
        }
    
        //将相同生日的学生放在一起
        else
        {
            strcpy(bir[j].ids[bir[j].nums],stu[i].id);
            bir[j].nums++;
        }
    }
    //输出
    for(i=0;i<k;i++)
    {
       //只输出同一天生日学生数>=2的数组
        if(bir[i].nums > 1)
        {
            printf("%d %d ",bir[i].month,bir[i].day);
            for(j=0;j<bir[i].nums;j++)
                printf("%s ",bir[i].ids[j]);
            printf("\n");
        }
    }
}
/**********   End   **********/

总结

通过对这道题的解析,相信大家已经都理解了。当然这只是其中一种解题思路,可能还有更好的方法,欢迎大家在评论区里分享。最后,希望大家在遇到困难时不要放弃,多想想,多尝试尝试!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python进阶篇(三)-- TCP套接字与UDP套接字编程

1 Python3 网络编程 1.1 介绍 本文将首先利用 Python 实现面向TCP连接的套接字编程基础知识&#xff1a;如何创建套接字&#xff0c;将其绑定到特定的地址和端口&#xff0c;以及发送和接收数据包。其次还将学习 HTTP 协议格式的相关知识。在此基础上&#xff0c;本篇将用 Pyt…

Spring boot项目编译后未能加载静态资源文件

起因: 因甲方爸爸加了一个紧急的需求: 需要搞一个文件上传和下载功能. 我心中想:这不简单,搞个资源服务器,将上传文件放上去,然后访问资源链接就行了. 但接下来甲方爸爸说 不需要这莫麻烦,直接将文件放服务器里,用的时候下载到资源文件夹下就行. 我心里想: 我擦嘞 还能这样!! 然…

【C++】—— STL简介(了解)

前言&#xff1a; 在上节&#xff0c;我们简单的认识了模板的基本概念。今天我简单的给大家介绍一下关于 STL 。 目录 &#xff08;一&#xff09; 什么是STL &#xff08;二&#xff09; STL的版本 &#xff08;三&#xff09; STL的六大组件 &#xff08;四&#xff09;…

Tomcat概述以及部署与优化

一、Tomcat概述 1、Tomcat的概念 Tomcat是Java语言开发的&#xff0c;服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&am…

Python入门基础小练习

通过前面的两个篇章Python-入门基础篇和Python-入门基础语句篇大家应该已经认识了python基础的语句和函数了&#xff0c;并且可以使用pycharm编译器创建.py文件进行运行了&#xff0c;今天适当的来一些小练习&#xff0c;给枯燥的学习增添一些趣味性。 判断一个数是否为偶数 …

linux服务器实现百万并发遇到的问题以及解决思路

目录 前言服务器与客户端的配置介绍server 代码client 代码遇到的问题error too many open files为什么会出现这个问题解决这个问题的思路 killed&#xff08;已杀死&#xff09;为什么会出现这个问题解决这个问题的思路 最终结果学到的经验教训 前言 在完成百万并发服务器的时…

搭建家庭影音媒体中心 - 公网远程连接Jellyfin流媒体服务器

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

MySQL高级第十六篇:数据库日志有哪些(慢查询日志、通用查询日志、错误日志和二进制日志)

MySQL高级第十六篇&#xff1a;数据库日志有哪些&#xff08;慢查询日志、通用查询日志、错误日志和二进制日志&#xff09; 一、MySQL支持的日志有哪些&#xff1f;1. 日志类型总结2. 日志有什么缺点吗&#xff1f; 二、通用查询日志&#xff08;slow query log&#xff09;三…

【开发工具】idea2023.1社区版设置优化,媲美旗舰版

相信大家很多时候都是用旗舰版来开发&#xff0c;各种序列号破解包各种搞&#xff0c;但说不定哪天又失效了那天又爆泄漏隐私安全问题。随着idea的版本升级破解也不好搞了&#xff0c;所以我就直接用了社区版&#xff0c;经过一番折腾发现社区版一点不比旗舰版差&#xff0c;可…

Linux文件类型与属性

一、文件类型 Linux 系统下一共分为 7 种文件类型。通过 stat 命令或者 ls 命令来查看文件类型。 - &#xff1a;普通文件 d &#xff1a;目录文件 c &#xff1a;字符设备文件 b &#xff1a;块设备文件 l &#xff1a;符号链接文件 s &#xff1a;套接字文件 p &…

Jeston NANO 配置并安装 torch+ torchvision

由于nano的arm64架构&#xff0c;所以用它进行深度学习配置部署时会与用普通电脑&#xff08;x86&#xff09;有所不同: x86架构 x86架构是最常用的计算机架构之一&#xff0c;它是基于英特尔的8086处理器所设计的&#xff0c;后来又逐渐发展成x86-64架构&#xff0c;支持64位处…

开放原子训练营(第二季)RT-Thread Nano学习营刘玉宽

4月22日周六&#xff0c;早早起床充满期待的来到了北京艾丽华酒店&#xff0c;参加“2023年RT-Thread线下培训”。这是疫情三年以来开放原子在北京第一次组织的线下活动。 进入到会场&#xff0c;被震撼了&#xff0c;好火爆啊————满满一屋子人&#xff0c;有白发苍苍的老者…

MySQL运维36-排队论

文章目录 1、排队模型2、什么是排队论3、李特尔法则&#xff08;Little’s law&#xff09;3.1、李特尔法则的内容3.2、李特尔法则的意义 4、肯德尔排队表示法4.1、肯德尔表示法的核心要素A/S/m4.2、肯德尔表示法中对顾客达到分布的表示&#xff1a;4.3、用肯德尔表示法表示的常…

day03_注释丶关键字丶标识符丶常量

​注释 注释的概念&#xff1a;在编写程序的过程中&#xff0c;对程序代码进行解释说明。 代码本身和人类的自然语言相比&#xff0c;可读性肯定是要差一些&#xff0c;所以为了更快能够知道代码的含义、作用、需要注意地方&#xff0c;所有程序员都应该养成写注释的好习惯。 …

【安卓源码】Binder机制1-Servicemanager 进程的启动和defaultServiceManager

1. servicemanager 进程的启动 对于用户空间&#xff0c;不同进程之间彼此是不能共享的&#xff0c;而内核空间却是可共享的。Client进程向Server进程通信&#xff0c;恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的&#xff0c;Client端与Server端进程往往采用io…

Linux客观题错题笔记

目录 第一章课后测试 课堂测试一 课堂测试2 第二次课后测试 课堂测验4 第4次课后作业 Linux 课堂测试5 第五次课后测试 自测一 实验疑难点 第一章课后测试 a 课堂测试一 d 课堂测试2 bb 第二次课后测试 a , b c,d,c 课堂测验4 a 第4次课后作业 c.dc,c Lin…

自动化测试系列-Selenium三种等待详解

一. 强制等待 sleep 在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;_哔哩哔哩_bilibili在华为工作了10年的大佬出的Web自动化测试教程&#xff0c;华为现用技术教程&#xff01;共计16条视频&#xff0c;包括&#xff1a;1. 【web自动…

[POJ - 1015]Jury Compromise(01背包问题)

[POJ - 1015]Jury Compromise&#xff08;01背包问题&#xff09; 一、问题二、分析1、状态表示2、状态转移3、方案输出 三、代码 一、问题 二、分析 这道题可以转化为一个01背包问题&#xff0c;问题描述可以改为&#xff0c;每个物品具有两个属性 a a a和 b b b&#xff0c;…

异构系统的事务统一处理模型Saga

承接上文分布式事务Seata-TCC事务模式 Saga事务模式相对来说是最复杂的&#xff0c;用的不多&#xff0c;只需要把概念理解透就可以了。 Saga是Seata提供的长事务解决方案&#xff0c;在业务流程中每个参与者都提供本地事务&#xff0c;当出现某个参与者失败的情况则补偿前面已…

如何设计一个牛逼的API接口

在日常开发中&#xff0c;总会接触到各种接口。前后端数据传输接口&#xff0c;第三方业务平台接口。一个平台的前后端数据传输接口一般都会在内网环境下通信&#xff0c;而且会使用安全框架&#xff0c;所以安全性可以得到很好的保护。这篇文章重点讨论一下提供给第三方平台的…