C的实用笔记40——结构体数组

2023-05-16

1.结构体数组的定义及初始化

结构体数组看起来像二维数组,但并不是

#include <stdio.h>
struct Student
{
    int num;
    char name[32];
    char sex;
    int age;
    double score;
    char addr[32];
};
int main(int argc, char const *argv[])
{
    struct Student arr[3] = {
        {2,"张三",'M',17,98,"北京"},
        {3,"李四",'F',18,89.5,"上海"},
        {4,"王五",'M',18,100,"深圳"}
    };
    return 0;
}

2.结构体数组的遍历

1、知识点:

  1. 与计算数组长度相同,可以通过sizeof计算结构体数组长度
  2. 结构体数组每个元素都是结构体变量,因此也是用点运算符引用结构体变量的成员变量。

2、举例:

#include <stdio.h>
struct Student
{
    int num;
    char name[32];
    char sex;
    int age;
    double score;
    char addr[32];
};
int main(int argc, char const *argv[])
{
    int i;
    int len;
    struct Student arr[3] = {
        {2,"张三",'M',17,98,"北京"},
        {3,"李四",'F',18,89.5,"上海"},
        {4,"王五",'M',18,100,"深圳"}
    };
    len = sizeof(arr) / sizeof(arr[0]);
    for(i=0; i<len; i++){
        printf("学号:%d,名字:%s,年龄:%d,分数:%lf,地址:%s\n", \
            arr[i].num, arr[i].name, arr[i].age, arr[i].score, arr[i].addr);
    }
    return 0;
}

3.习题

习题1:试完成选票系统,功能包括确定候选人、群众唱票、公布结果

  1. 思路:
    声明结构体1: struct Candidate { char name[32]; int tickets; };	代表候选人的名字和得票数
    1. 假设候选人有三个,定义一个结构体数组保存三人信息: struct Candidate xm[3]; 
    2. 假设不知道数组长度,需要用sizeof运算符计算数组长度,保存在变量len中: 
    	int len = sizeof(xm) / sizeof(xm[0]);
    //1.初始化环节
    3. for循环,代表结构体数组下标(第i个选民)的循环变量i从0开始,<len 时,进入循环
    	3.1 初始化第i位选民的得票数为0: xm[i].tickets = 0;
        3.2 通过键盘输入的方式来确认结构体数组中每位候选人的名字,将字符串保存在每个结构体变量的name中:
    		scanf("%[^\n]%*c", xm[i].name);      或者      gets(xm[i].name);
    //2.唱票环节
    4. for循环,代表投票人的循环变量i从0开始,<total 时进入循环	//变量total代表总投票人数
        4.1 令标记废票的变量mark,从开始进入循环时变成0,用0代表找不到候选人,用1代表找到候选人
        4.2 通过键盘输入的方式来确认投票人投给的对象,将字符串保存在一个临时字符数组tempName[32]中
        	需要注意的是,每次进入唱票循环时,调用memset()函数用'\0'清空tempName
        4.3 for循环,代表结构体数组下标(第j个选民)的循环变量j从0开始,<len 时,进入循环
        //内在逻辑:每个人投完票后,需要将他输入的字符串与结构体数组中每个候选人的名字进行比较
        	4.3.1 用strcmp()函数判断,tempName是否和xm[j].name完全相同,
            	4.3.2 如果是,说明能找到候选人
                	4.3.2.1 让这个人的得票数加1: xm[j].tickets++;
    				4.3.2.2 修改代表找到候选人的变量mark: mark = 1;	//12行
    				4.3.2.3 找到人后就不用继续往下找了,用break提前退出内层循环
        4.4 经过4.3的投票人名比对环节后,判断代表找到候选人的变量mark是否等于0	//12行
        	4.4.1 如果是,说明这是个弃票
            		那么,修改记录弃票的循环变量invalidTickets: invalidTickets++;
    //3.公布结果
    5. for循环,代表结构体数组下标(第i个选民)的循环变量i从0开始,<len 时,进入循环
    	5.1 打印每个候选人的名字和得票数
    6. 下面要比对候选人得票数,选出大者,不妨暂时认为第0个选民xm[0]得票数最多,令: max = xm[0];
    	//这里max是和xm[0]、xm[1]、xm[2]一样类型的结构体变量,需要提前定义
    7. for循环,代表结构体数组下标(第i个选民)的循环变量i从1开始,<len 时,进入循环
    	7.1 判断max.tickets是否小于xm[i].tickets
        	7.1.1 如果是,
            		那么,认为xm[i]选民的得票数最多,令: max = xm[i];
    8. 打印候选人中得票数最多的候选人、票数,以及弃票情况

  2. 代码:
    #include <stdio.h>
    #include <string.h>
    struct Candidate
    {
        char name[32];
        int tickets;
    };
    int main(int argc, char const *argv[])
    {
        struct Candidate xm[3];
        struct Candidate max;
        int i;
        int total = 5;                                      
        char tempName[32];
        int len = sizeof(xm) / sizeof(xm[0]);  
        int j;
        int mark;
        int invalidTickets = 0;
        /* 1.初始化,清空选票数,确认候选者 */
        for(i=0; i<len; i++){           
            xm[i].tickets = 0;
            printf("请输入第%d个选民的名字:\n", i+1);
            gets(xm[i].name);
        }  
        /* 2.唱票环节,有total个投票者 */
        for(i=0; i<total; i++){         
            mark = 0;
            printf("第%d个同学,请输入你投票给谁:\n", i+1);
            memset(tempName, '\0', sizeof(tempName));       //将临时名字每次进行清空
            scanf("%[^\n]%*c", tempName);
            for(j=0; j<len; j++){                           //遍历候选者,试着找出用户输入的人名
                if( strcmp(tempName, xm[j].name) == 0 ){
                    xm[j].tickets++;
                    mark = 1;
                    break;
                }
            }
            if(mark == 0){                                  //一次唱票后,判断本次投票是否有效
                puts("没有此候选人,视为弃票");
                invalidTickets++;
            }
        }
        /* 3.公布投票结果 */
        for(i=0; i<len; i++){           
            printf("候选人:%s,得票数:%d\n", xm[i].name, xm[i].tickets);
        }
        max = xm[0];
        for(i=1; i<len; i++){           
            if(max.tickets < xm[i].tickets){
                max = xm[i];
            }
        }
        printf("%s以%d票当选\n", max.name, max.tickets);
        printf("废票共计%d张\n", invalidTickets);
        return 0;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C的实用笔记40——结构体数组 的相关文章

  • 转载:malloc和free底层实现

    转载 xff1a malloc和free底层实现 内存管理内幕 Linux内存管理 xff1a Malloc 本文引用了下面这篇文章 xff0c 读完下面 xff0c 应该读下上面两篇文章 xff0c 其中 xff0c 内存管理内幕 提供了
  • qemu tcg代码执行流程

    转自 xff1a http blog csdn net alloc7 article details 7719823 一 qemu简介 qemu是使用动态二进制翻译的cpu模拟器 xff0c 它支持两种运行模式 xff1a 全系统模拟和用户
  • c语言如何调用c++(本文从qemu开发中总结)

    背景 xff1a 有时候一个工程中有c语言编写的代码 c xff0c 也有c 43 43 cpp 编写的 xff0c 分别用 xff43 语言编译器 xff08 这里指 xff47 xff43 xff43 xff09 和 xff43 xff
  • c++常错语法

    1 new T 代表创建一个T类的对象指针 xff0c new T 标识创建T类对象数组指针 2 template模板类只能把成员函数都定义在 h中 xff0c 分开 h和 cpp会报链接错误 3 类A 的成员变量包含B的对象B b xff
  • UEFI EDK2开发环境设置关键点/修改环境变量

    1 问题描述 Linux下当修改了已经编译过的EDK2工程顶层路径后 进入工程顶层路径source edksetup sh会报错 2 解决步骤 有一个隐藏问题非常容易被忽视 那就是EDK2工程的环境变量可能还是原来的旧的 这时候 1 进入工
  • linux静态库.a使用常见错误

    在linux中如果一个程序需要用到 a 有以下几点需要注意 1 如果x o与y o中用到了静态xx a中的函数 不能用gcc xx a o test x o y o这种方式编译 会提示那些函数undefined 正确的做法是gcc o te
  • C/C++多线程常见问题

    1 问题 1 1 创建线程后是否立马开始并行执行 答 主线程创建了子线程之后 后者并不是立即就开始运行了 至少在Linux操作系统下 1 子线程和主线程运行在一个core上 那还需要等待主线程交出core控制权 可能是时间片耗尽 2 子线程
  • 2020 年百度之星·程序设计大赛 - 初赛二 题解

    废话 丑话说在前头 xff0c T8我不会 xff08 没错是指我会出丑 xff09 T1 既然要玩尽可能多轮 xff0c 那么每轮投入的钱就要最少 xff0c 也就是 m m m 元 xff0c 那么可以算出每轮游戏会亏损
  • QEMU内存管理

    QEMU内存管理 1 QEMU中管理的Memory有 xff1a 普通的RAM MMIO 内存控制器 将物理内存动态的映射到不同的虚拟地址空间 2 QEMU的Memory是以一个MemoryRegin为节点组成的非循环图的形式组织的 叶子节
  • Matlab实现基于二维伽马函数的光照不均匀图像自适应校正算法

    Matlab程序 xff1a 基于二维伽马函数的光照不均匀图像自适应校正算法 clc close all tic im 61 imread 39 你的图片 jpg 39 figure imshow im title 39 原图 39 h s
  • SCI回复评审意见模板

    一般反馈回来修改时 xff0c 要给编辑重新写一封cover letter xff0c 表示尊重与感谢 xff0c 范文如下 句式大家可以依照自己的习惯表达修改 xff0c 多参考他人经验 xff09 Dear XX xff08 给你回信的
  • 毕业快乐 —— 写于2020年3月13日

    很久没有经营这个博客了 今天来写点什么罢 2020的春天 xff0c 由于猝不及防的疫情 xff0c 参加了一场特殊的毕业答辩 线上答辩形式 没有西装和鲜花 xff0c 似乎缺少了一些仪式感 但毕业似乎真真切切就是一件水到渠成的事情 xff
  • Mac连上WIFI但是无法上网的3种解决方案

    一般我们最先会认为是DNS问题 xff0c 你可以试下用ip访问一个服务器 xff08 网站 xff09 看下行不行 xff0c 如果也不行那就应该不是DNS的问题了 或者改变一下DNS xff0c 如114 xff0c 或者自己内网要求的
  • 简单粗暴理解支持向量机(SVM)及其MATLAB实例

    目录 SVM概述 SVM的改进 xff1a 解决回归拟合问题的SVR 多分类的SVM QP求解 SVM的MATLAB实现 xff1a Libsvm 实例 用SVM分类 实例 用SVM回归 SVM概述 SVM已经是非常流行 大家都有所耳闻的技
  • 极限学习机(Extreme Learning Machine, ELM)原理详解和MATLAB实现

    目录 引言 极限学习机原理 MATLAB中重点函数解读 极限学习机的MATLAB实践 引言 极限学习机不是一个新的东西 xff0c 只是在算法 xff08 方法 xff09 上有新的内容 在神经网络结构上 xff0c 就是一个前向传播的神经
  • 粒子群优化算法(PSO)简介及MATLAB实现

    目录 粒子群优化算法概述 PSO算法步骤 PSO xff08 粒子群优化算法 xff09 与GA xff08 遗传算法 xff09 对比 PSO的MATLAB实现 粒子群优化算法概述 粒子群优化 PSO particle swarm opt
  • 结构化概率模型

    机器学习的算法经常会涉及到在非常多的随机变量上的概率分布 通常 xff0c 这些概率分布涉及到的直接相互作用都是介于非常少的变量之间的 使用单个函数来描述整个联合概率分布是非常低效的 无论是计算上还是统计上 我们可以把概率分布分解成许多因子
  • Fuzzy C-Means(模糊C均值聚类)算法原理详解与python实现

    目录 模糊理论 Fuzzy C Means算法原理 算法步骤 python实现 参考资料 本文采用数据集为iris 将iris txt放在程序的同一文件夹下 请先自行下载好 模糊理论 模糊控制是自动化控制领域的一项经典方法 其原理则是模糊数
  • Vs2017使用C++封装MySQL数据库--(超详细图文详解)

    文章目录 1 Windows下安装MySQL数据库2 环境配置3 常用SQL语句4 数据库常用的API接口5 使用C 43 43 对这些常用API进行封装 1 Windows下安装MySQL数据库 1 1下载MySQL 因为我的电脑是64位
  • python实现基于SIFT算法的图像配准(仿射变换)

    话不多说 xff0c 直接上代码 xff0c 可以用的话别忘了请喝可乐 xff01 xff08 手动笑哭脸 xff09 用法 第45 46行的输入 xff1a img1 61 cv2 imread 39 sift 3 jpg 39 img2

随机推荐