一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据)。如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。

目录

一、定义结构体数组

1.1举例说明

1.2定义

二、结构体数组的应用举例


一、定义结构体数组

1.1举例说明

下面举一个简单的例子来说明怎样定义和引用结构体数组。

举例:有 3 个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。

解题思路:显然,需要设一个结构体数组,数组中包含 3 个元素,每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)。输入被选人的姓名,然后与数组元素中的 “ 姓名 ” 成员比较,如果相同,就给这个元素中的 “ 得票数 ” 成员的值加 1。最后输出所有元素的信息。

#include<stdio.h>
#include<string.h>
struct Person       //声明结构体类型
{char name[20];int count;
};int main()
{struct Person leader[3] = { "zhang",0,"wang",0,"liu",0 };   //初始化结构体变量char leader_name[20];for (int i = 0; i < 10; i++){scanf_s("%s", leader_name, 20);     //输入所选候选人姓名for (int j = 0; j < 3; j++){if (strcmp(leader_name, leader[j].name) == 0)leader[j].count++;}}printf("结果是:\n");for (int j = 0; j < 3; j++){printf("%5s:%d\n", leader[j].name, leader[j].count);}return 0;
}

运行结果:

程序分析:

定义一个全局的结构体数组 leader,它有 3 个元素,每一个元素包含两个成员 name(姓名)和 count(票数)。在定义数组时使之初始化,将 " Li " 赋给 leader[0].name,0 赋给 leader[0].count," Zhang "赋给 leader[1].name,0 赋给 leader[1].count," Sun " 赋给 leader[2].name,0 赋给 leader[2].count。这样,3 位候选人的票数全部先置零。

在主函数中定义字符数组 leader_name,用它存放被选人的姓名。在每次循环中输入一个被选人姓名,然后把它与结构体数组中 3 个候选人姓名相比,看它和哪一个候选人的名字相同。注意leader_name 是和 leader 数组第 j 个元素的 name 成员相比。若 j 为某一值时,输入的姓名与 leader[j].name 相等,就执行 “ leader[j].count++”,由于成员运算符 “.” 优先于自增运算符 “++”,因此它相当于(leader[j].count)++,使 leader[j] 成员 count 的值加 1。在输入和统计结束之后,将 3 人的名字和得票数输出。

1.2定义

(1)定义结构体数组一般形式是

struct 结构体名
{

        成员表列

} 数组名[数组长度];

先声明一个结构体类型(如 struct Person),然后再用此类型定义结构体数组:

结构体类型 数组名[数组长度];

如:

struct Person leader[3];        //leader是结构体数组名

(2)对结构体数组初始化的形式是在定义数组的后面加上:

= {初值表列};

如:

struct Person leader[3] = {"zhang", 0, "wang", 0, "liu", 0};

二、结构体数组的应用举例

举例:有 n 个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

解题思路:用结构体数组存放 n 个学生信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩)。

#include<stdio.h>
struct Student      //声明结构体类型
{int num;char name[20];float score;
};int main()
{const int n = 5;      //定义常变量struct Student stu[n] = { 1001,"wang",88,1002,"li",85,1003,"liu",98,1004,"zhao",95,1005,"wu",87 };for (int i = 0; i < n - 1; i++)       //选择排序{int k = i;for (int j = i + 1; j < n; j++){if (stu[j].score > stu[k].score)k = j;}if (k != i)        //stu[k]和stu[i]互换{Student temp;temp = stu[i];stu[i] = stu[k];stu[k] = temp;}}printf("排序为:\n");for (int i = 0; i < n; i++){printf("%6d %8s %6.2f\n", stu[i].num, stu[i].name, stu[i].score);}
}

运行结果: 

程序分析:

(1)程序中第 11 行定义了常变量 n,在程序运行期间它的值不能改变。如果学生数改为 30 人,只须把第 11 行改为即可。

也可以不用常变量,而用符号常量,可以取消第 11 行,同时在第 2 行前加一行:

# define N 5

(2)在定义结构体数组时进行初始化,为清晰起见,将每个学生的信息用一对花括号包起来,这样做,阅读和检查比较方便,尤其当数据量多时,这样是有好处的。

(3)在执行第 1 次外循环时i的值为0,经过比较找出 5 个成绩中最高成绩所在的元素的序号为 k,然后将 stu[k] 与 stu[i] 对换(对换时借助临时变量temp)。执行第 2 次外循环时i的值为 1,参加比较的只有 4 个成绩了,然后将这 4 个成绩中最高的所在的元素与 stu[1] 对换。其余类推。注意临时变量 temp 也应定义为 struct Student 类型,只有同类型的结构体变量才能互相赋值。程序 21 行是将 stu[k] 元素中所有成员和 stu[i] 元素中所有成员整体互换(而不必人为地指定一个一个成员地互换)。从这点也可以看到使用结构体类型的好处。

C语言自定义数据类型(二)使用结构体数组相关推荐

  1. c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...

    C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...

  2. C语言学生信息管理系统(结构体数组,文件)

    C语言学生信息管理系统(结构体数组,文件) 这是初学时写的一个程序,比较菜,不喜勿喷.在一个结构体里定义结构体内所有的信息(如果信息也需要分类则可以再定义一个结构体并在当前结构体内声明,我的这个代码在 ...

  3. Nwafu-Oj-1444 Problem l C语言实习题七——2.结构体数组的定义与引用

    问题 : C语言实习题七--2.结构体数组的定义与引用 时间限制: 1 Sec  内存限制: 128 MB 提交: 4459  解决: 2011 [提交][状态][讨论版] 题目描述 定义一个职工结构 ...

  4. C语言常用编程技巧-结构体数组

    本文主要用来记录C语言常用编程技巧,完成一下目的: 1.函数指针如何定义使用: 2.结构体数组如何定义使用: 3.callback 方法使用技巧: 以下代码为在ubuntu 系统进行编译,文件名为 s ...

  5. go语言json字符串解析为结构体数组,结构体指针的数组

    废话不多说直接上效果图 完整代码如下 package main import ("encoding/json""fmt" ) // 结构体定义 type rob ...

  6. 在c语言中开辟一个数组空间,c语言如何在动态的结构体数组开辟新空间

    #include struct record { float coef; int expn; }; void main() { int num, i; struct record *array; ar ...

  7. c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  8. 自动生成员工号c语言,C语言自定义数据类型

    C语言自定义数据类型 第7章 自定义数据类型7.1 结构体类型 7.2 共用体 7.3 枚举类型 7.4 用typedef声明类型C+提供了许多种基本的数据类型(如int.float. double. ...

  9. C语言结构体变量和结构体数组-学习笔记(十六)

    一.结构体变量 1.结构体概念 将不同类型的数据组合成一个有机的整体即为结构体.结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型. 2.结构体类型及结构体变量定义 (1)结构体类型声明 ...

最新文章

  1. 普华永道2030汽车产业报告 私家车真正Out了!
  2. 【转:理论知识】SAP在建工程转固定资产
  3. leetcode 10 --- 正则表达式匹配
  4. 一文梳理水下目标检测方法
  5. reg51.h和reg52.h头文件
  6. 使用php发送Http请求,抓取网页数据
  7. 计算机大学生职业规划书word模板,大学生职业生涯规划书模板(附word)
  8. cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-q3d_8t8e\opencv\modul
  9. 计算机专业毕业顶岗实习周记,计算机专业毕业顶岗实习周记10篇
  10. 搞机的神器们——Xposed,Magisk,TaiChi(太极)的安装使用
  11. Windows10 桌面显示“我的电脑”
  12. 创新科技 新BMW 7系 有你夫复何求
  13. Linux Chromium源码编译
  14. Haproxy基础知识
  15. 【计算机网络】笔记及考点
  16. 倍控G30-J4125工控机开箱
  17. 打卡学习——应对焦虑的一剂良方!
  18. 巴士拉银匠哈桑的故事(二)
  19. 智能车改舵机中值步骤_速度,舵机测试,专为舵机调中值
  20. Hysplit模型气象数据下载

热门文章

  1. Ubuntu安装显卡驱动及设置3d桌面
  2. 小红书3大新功能上线,提升笔记转化率和品牌投放效果
  3. 八斗大数据20期冲击百万年薪完结分享
  4. MCU电子方案开发 MUC单片机 EM78P372N 8位OTP微控制器
  5. 极飞C2000分析报告
  6. mysql根据分隔符将一行数据拆分成多行数据
  7. Oracle数据库之同义词(SYNONYM)使用
  8. 完爆90%的数据库性能毛病!
  9. Java EE 是什么?
  10. python read csv dtype_如何使用pandas将csv列作为dtype列表读取?