当前位置: 首页 > news >正文

C语言程序设计-11 结构体与共用体

11.1 定义一个结构的一般形式

11.2 结构类型变量的说明

1. 先定义结构,再说明结构变量。

2. 在定义结构类型的同时说明结构变量。

3. 直接说明结构变量。

11.3 结构变量成员的表示方法

11.4 结构变量的赋值

结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。
【例 11.1】给结构变量赋值并输出其值。

#include <math.h>
#include <stdio.h>void main()
{struct stu{int num;char *name;char sex;float score;} boy1, boy2;boy1.num = 102;boy1.name = "Zhang ping";printf("input sex and score\n");scanf("%c %f", &boy1.sex, &boy1.score);boy2 = boy1;printf("Number=%d\nName=%s\n", boy2.num, boy2.name);printf("Sex=%c\nScore=%f\n", boy2.sex, boy2.score);}

本程序中用赋值语句给 num 和 name 两个成员赋值,name 是一个字符串指针变量。用 scanf
函数动态地输入 sex 和 score 成员值,然后把 boy1 的所有成员的值整体赋予 boy2。最后分
别输出 boy2 的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。

11.5 结构变量的初始化

和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。
【例 11.2】对结构变量初始化。

#include <math.h>
#include <stdio.h>void main()
{struct stu /*定义结构*/{int num;char *name;char sex;float score;} boy2, boy1 = {102, "Zhang ping", 'M', 78.5};boy2 = boy1;printf("Number=%d\nName=%s\n", boy2.num, boy2.name);printf("Sex=%c\nScore=%f\n", boy2.sex, boy2.score);
}

本例中,boy2,boy1 均被定义为外部结构变量,并对 boy1 作了初始化赋值。在 main 函
数中,把 boy1 的值整体赋予 boy2,然后用两个 printf 语句输出 boy2 各成员的值。

11.6 结构数组的定义

【例 11.3】计算学生的平均成绩和不及格的人数。

#include <math.h>
#include <stdio.h>struct stu
{int num;char *name;char sex;float score;
} boy[5] = {{101, "Li ping", 'M', 45},{102, "Zhang ping", 'M', 62.5},{103, "He fang", 'F', 92.5},{104, "Cheng ling", 'F', 87},{105, "Wang ming", 'M', 58},
};
void main()
{int i, c = 0;float ave, s = 0;for (i = 0; i < 5; i++){s += boy[i].score;if (boy[i].score < 60)c += 1;}printf("s=%f\n", s);ave = s / 5;printf("average=%f\ncount=%d\n", ave, c);
}

本例程序中定义了一个外部结构数组 boy,共 5 个元素,并作了初始化赋值。在 main 函
数中用 for 语句逐个累加各元素的 score 成员值存于 s 之中,如 score 的值小于 60(不及格)
即计数器 C 加 1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。

【例 11.4】建立同学通讯录

#include "stdio.h"
#define NUM 3struct mem
{char name[20];char phone[10];
};
void main()
{struct mem man[NUM];int i;for (i = 0; i < NUM; i++){printf("input name:\n");gets(man[i].name);printf("input phone:\n");gets(man[i].phone);}printf("name\t\t\tphone\n\n");for (i = 0; i < NUM; i++)printf("%s\t\t\t%s\n", man[i].name, man[i].phone);
}

本程序中定义了一个结构 mem,它有两个成员 name 和 phone 用来表示姓名和电话号码。
在主函数中定义 man 为具有 mem 类型的结构数组。在 for 语句中,用 gets 函数分别输入各
个元素中两个成员的值。然后又在 for 语句中用 printf 语句输出各元素中两个成员值。

11.7 结构指针变量的说明和使用

11.7.1 指向结构变量的指针

下面通过例子来说明结构指针变量的具体说明和使用方法。
【例 11.5】

#include "stdio.h"
#define NUM 3struct stu
{int num;char *name;char sex;float score;
} boy1 = {102, "Zhang ping", 'M', 78.5}, *pstu;
main()
{pstu = &boy1;printf("Number=%d\nName=%s\n", boy1.num, boy1.name);printf("Sex=%c\nScore=%f\n\n", boy1.sex, boy1.score);printf("Number=%d\nName=%s\n", (*pstu).num, (*pstu).name);printf("Sex=%c\nScore=%f\n\n", (*pstu).sex, (*pstu).score);printf("Number=%d\nName=%s\n", pstu->num, pstu->name);printf("Sex=%c\nScore=%f\n\n", pstu->sex, pstu->score);
}

本例程序定义了一个结构 stu,定义了 stu 类型结构变量 boy1 并作了初始化赋值,还定
义了一个指向 stu 类型结构的指针变量 pstu。在 main 函数中,pstu 被赋予 boy1 的地址,因
此 pstu 指向 boy1。然后在 printf 语句内用三种形式输出 boy1 的各个成员值。从运行结果
可以看出:
结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。

11.7.2 指向结构数组的指针

【例 11.6】用指针变量输出结构数组。

#include "stdio.h"
#define NUM 3struct stu
{int num;char *name;char sex;float score;
} boy[5] = {{101, "Zhou ping", 'M', 45},{102, "Zhang ping", 'M', 62.5},{103, "Liou fang", 'F', 92.5},{104, "Cheng ling", 'F', 87},{105, "Wang ming", 'M', 58},
};
main()
{struct stu *ps;printf("No\tName\t\t\tSex\tScore\t\n");for (ps = boy; ps < boy + 5; ps++)printf("%d\t%s\t\t%c\t%f\t\n", ps->num, ps->name, ps->sex, ps->score);
}

11.7.3 结构指针变量作函数参数

【例 11.7】计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。

#include "stdio.h"struct stu
{int num;char *name;char sex;float score;
} boy[5] = {{101, "Li ping", 'M', 45},{102, "Zhang ping", 'M', 62.5},{103, "He fang", 'F', 92.5},{104, "Cheng ling", 'F', 87},{105, "Wang ming", 'M', 58},
};
main()
{struct stu *ps;void ave(struct stu * ps);ps = boy;ave(ps);
}
void ave(struct stu *ps)
{int c = 0, i;float ave, s = 0;for (i = 0; i < 5; i++, ps++){s += ps->score;if (ps->score < 60)c += 1;}printf("s=%f\n", s);ave = s / 5;printf("average=%f\ncount=%d\n", ave, c);
}

本程序中定义了函数 ave,其形参为结构指针变量 ps。boy 被定义为外部结构数组,因
此在整个源程序中有效。在 main 函数中定义说明了结构指针变量 ps,并把 boy 的首地址赋
予它,使 ps 指向 boy 数组。然后以 ps 作实参调用函数 ave。在函数 ave 中完成计算平均成
绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。

11.8 动态存储分配

【例 11.8】分配一块区域,输入一个学生数据。

#include "stdio.h"
#include <stdlib.h>main()
{struct stu{int num;char *name;char sex;float score;} *ps;ps = (struct stu *)malloc(sizeof(struct stu));ps->num = 102;ps->name = "Zhang ping";ps->sex = 'M';ps->score = 62.5;printf("Number=%d\nName=%s\n", ps->num, ps->name);printf("Sex=%c\nScore=%f\n", ps->sex, ps->score);free(ps);
}

本例中,定义了结构 stu,定义了 stu 类型指针变量 ps。然后分配一块 stu 大内存区,
并把首地址赋予 ps,使 ps 指向该区域。再以 ps 为指向结构的指针变量对各成员赋值,并用
printf 输出各成员值。最后用 free 函数释放 ps 指向的内存空间。整个程序包含了申请内存
空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

11.9 链表的概念

【例 11.9】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结
构中只有学号和年龄两项。可编写一个建立链表的函数 creat。程序如下:

#include <stdio.h>
#include <stdlib.h>#define NULL1 0
#define TYPE struct stu
#define LEN sizeof(struct stu)
struct stu
{int num;int age;struct stu *next;
};
TYPE *creat(int n)
{struct stu *head, *pf, *pb;int i;for (i = 0; i < n; i++){pb = (TYPE *)malloc(LEN);printf("input Number and Age\n");scanf("%d%d", &pb->num, &pb->age);if (i == 0)pf = head = pb;elsepf->next = pb;pb->next = NULL1;pf = pb;}return (head);
}

在函数外首先用宏定义对三个符号常量作了定义。这里用 TYPE 表示 struct stu,用 LEN
表示 sizeof(struct stu)主要的目的是为了在以下程序内减少书写并使阅读更加方便。结构
stu 定义为外部类型,程序中的各个函数均可使用该定义。
creat 函数用于建立一个有 n 个结点的链表,它是一个指针函数,它返回的指针指向 stu
结构。在 creat 函数内定义了三个 stu 结构的指针变量。head 为头指针,pf 为指向两相邻结
点的前一结点的指针变量。pb 为后一结点的指针变量。

11.10 枚举类型

11.10.1 枚举类型的定义和枚举变量的说明

11.10.2 枚举类型变量的赋值和使用

【例 11.10】

#include <stdio.h>
#include <stdlib.h>main()
{enum weekday{sun,mon,tue,wed,thu,fri,sat} a,b, c;a = sun;b = mon;c = tue;printf("%d,%d,%d", a, b, c);
}

【例 11.11】

#include <stdio.h>
#include <stdlib.h>main()
{enum body{a,b,c,d} month[31],j;int i;j = a;for (i = 1; i <= 30; i++){month[i] = j;j++;if (j > d)j = a;}for (i = 1; i <= 30; i++){switch (month[i]){case a:printf(" %2d %c\t", i, 'a');break;case b:printf(" %2d %c\t", i, 'b');break;case c:printf(" %2d %c\t", i, 'c');break;case d:printf(" %2d %c\t", i, 'd');break;default:break;}}printf("\n");
}

11.11 类型定义符 typedef

typedef 定义的一般形式为:
typedef 原类型名 新类型名

相关文章:

  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • Nginx基础理论
  • 智能温室大棚在无土栽培中的应用
  • MySQL:创建账户及修改密码
  • 在k8s中部署Elasticsearch高可用集群详细教程
  • Certificate数字证书的有效性验证
  • c#一个udp代码
  • asyncua模块中OPC UA的ua.Variant如何表示字典?
  • 四十八、openlayers地图调色总结——锐化、模糊、浮雕滤镜,调整地图色相、饱和度、亮度
  • 之所以选择天津工业大学,因为它是双一流、报考难度适宜,性价比高!天津工业大学计算机考研考情分析!
  • Java基础 - 练习(三)打印空心菱形
  • 超详细的selenium使用指南
  • 驾校在线考试系统源码 手机+PC+平板自适应
  • 了解指标体系1:指标是大数据开发中的关键要素
  • linux系统中,pwd获取当前路径,dirname获取上一层路径;不使用 ../获取上一层路径
  • 自己简单写的 事件订阅机制
  • CAP理论的例子讲解
  • CSS实用技巧
  • ES6之路之模块详解
  • JavaScript 基本功--面试宝典
  • Python学习笔记 字符串拼接
  • Vue.js源码(2):初探List Rendering
  • 阿里研究院入选中国企业智库系统影响力榜
  • 力扣(LeetCode)56
  • 前端js -- this指向总结。
  • 设计模式 开闭原则
  • 用jQuery怎么做到前后端分离
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (剑指Offer)面试题34:丑数
  • (九)One-Wire总线-DS18B20
  • (六)激光线扫描-三维重建
  • (论文阅读11/100)Fast R-CNN
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)mysql_MYSQL(三)
  • (一)VirtualBox安装增强功能
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转) 深度模型优化性能 调参
  • (转)为C# Windows服务添加安装程序
  • .“空心村”成因分析及解决对策122344
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布