C语言自定义数据类型(六)使用枚举类型

目录

一、定义

二、详解

三、举例说明


一、定义

如果一个变量只有几种可能的值,则可以定义为枚举 (enumeration) 类型,所谓 “ 枚举 ” 就是指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。

声明枚举类型用 enum 开头。例如:

enum Weekday { sun, mon, tue, wed, thu,fri, sat };

以上声明了一个枚举类型 enum Weekday。然后可以用此类型来定义变量。例如:

enum Weekday workday, weekend;

workday 和 weekend 被定义为枚举变量,花括号中的 sun,mon,… ,sat 称为枚举元素或枚举常量。它们是用户指定的名字。枚举变量和其他数值型量不同,它们的值只限于花括号中指定的值之一。例如枚举变量 workday 和 weekend 的值只能是 sun 到 sat 之一。

workday = mon;		//正确, mon是指定的枚举常量之一
weekend = sun;		//正确, sunon是指定的枚举常量之一
weekday = monday;	//不正确, monday不是指定的枚举常量之一

枚举常量是由程序设计者命名的,用什么名字代表什么含义,完全由程序员根据自己的需要而定,并在程序中作相应处理。

也可以不声明有名字的枚举类型,而直接定义枚举变量例如:

enum { sun, mon, tue, wed, thu, fri, sat } workday, weekend;

声明枚举类型的一般形式为

enum[枚举名] {枚举元素列表};

其中,枚举名应遵循标识符的命名规则,上面的Weekday就是合法的枚举名。

二、详解

(1)C 编译对枚举类型的枚举元素按常量处理,故称枚举常量。不要因为它们是标识符(有名字)而把它们看作变量,不能对它们赋值。例如:

sun = 0; mon = 1;	//错误,不能对枚举元素赋值

(2)每一个枚举元素都代表一个整数,C 语言编译按定义时的顺序默认它们的值为 0,1,2,3,4,5 …。在上面的定义中,sun 的值自动设为 0,mon 的值为 1,… , sat 的值为 6。如果有赋值语句:

workday = mon;

相当于

workday = 1;

枚举常量是可以引用和输出的。例如:

printf("%d", workday);

将输出整数 1。

也可以人为地指定枚举元素的数值,在定义枚举类型时显式地指定,例如:

enum Weekday { sun = 7, mon = 1, tue, wed, thu, fri, sat } workday, weekend;

指定枚举常量 sun 的值为 7,mon 为 1,以后顺序加 1,sat 为 6。

由于枚举型变量的值是整数,因此 C99 把枚举类型也作为整型数据中的一种,即用户自行定义的整数类型。

(3)枚举元素可以用来作判断比较。例如:

if (workday == mon)…
if (workday > sun)…

枚举元素的比较规则是按其在初始化时指定的整数来进行比较的。如果定义时未人为指定,则按上面的默认规则处理,即第 1 个枚举元素的值为 0,故 mon > sun,sat > fri 。
通过下面的例子可以了解怎样使用枚举型数据。

三、举例说明

举例:口袋中有红、黄、蓝、白、黑 5 种颜色的球若干个。每次从口袋中先后取出 3 个球,问得到 3 种不同颜色的球的可能取法,输出每种排列的情况。

解题思路:球只能是 5 种颜色之一,而且要判断各球是否同色,可以用枚举类型变量处理。设某次取出的 3 个球的颜色分别为 i,j,k。根据题意, i,j,k 分别是5种色球之一,并要求 3 球颜色各不相同,即:i ≠ j,i ≠ k,j ≠ k 。可以用穷举法,即把每一种组合都试一下,看哪一组符合条件,就输出 i,j,k。

用 n 累计得到 3 种不同色球的次数。外循环使第 1 个球的颜色 i 从 red 变到 black。中循环使第 2 个球的颜色 j 也从 red 变到 black。如果 i 和 j 同色则显然不符合条件。只有 i 和 j 不同色 ( i ≠ j ) 时才需要继续找第 3 个球,此时第 3 个球的颜色 k 也有 5 种可能( red 到 black ),但要求第 3 个球不能与第 1 个球或第 ⒉个球同色,即 k ≠ i,k ≠ j。满足此条件就得到了 3 种不同色的球。输出这种 3 色组合的方案。然后使 n 加 1,表示又得到一次 3 球不同色的组合。外循环全部执行完后,全部方案就已输出完了。最后输出符合条件的总数 n。

如何输出 red,black 等颜色的单词。不能写成 “ printf(“%s”, red); ” 来输出字符串 " red "。可以采用“ printf(“%s”, "red"); ” 的方法输出。

为了输出 3 个球的颜色,显然应经过 3 次循环,第 1 次输出 i 的颜色,第 ⒉次输出 j 的颜色,第 3 次输出 k 的颜色。在 3 次循环中先后将 i,j,k 赋予 pri。然后根据 pri 的值输出颜色信息。在第 1 次循环时,pri 的值为 i,如果 i 的值为 red,则输出字符串 "red",其他类推。

#include<stdio.h>
enum Color			//声明枚举类型
{
	red,
	yellow,
	blue,
	white,
	black
};

enum Color i, j, k, pri;	//定义枚举变量i,j,k,pri;

int main()
{
	int n;
	n = 0;
	for (i = red; i <= black; i = (Color)(i + 1))				//外循环使i的值从red变到black
	{
		for (j = red; j <= black; j = (Color)(j + 1))			//中循环使j的值从red变到black
		{
			if (i != j)											//如果二球不同色
			{
				for (k = red; k <= black; k = (Color)(k + 1))	//内循环使k的值从red变到black
				{
					if ((k != i) && (k != j))					//如果3球不同色
					{
						n = n + 1;
						printf("%-4d", n);
						for (int loop = 1; loop <= 3; loop++)	//先后对3个球进行处理
						{
							switch (loop)						//loop的值从1到3
							{
							case 1:pri = i;						//loop的值为1时,把第1个球的颜色赋给pri
								break;
							case 2:pri = j;
								break;
							case 3:pri = k;
								break;
							default:
								break;
							}
							switch (pri)						//根据球的颜色输出相应的文字
							{
							case red:printf("%-10s", "red");
								break;
							case yellow:printf("%-10s", "yellow");
								break;
							case blue:printf("%-10s", "blue");
								break;
							case white:printf("%-10s", "white");
								break;
							case black:printf("%-10s", "black");
								break;
							default:
								break;
							}
						}
						printf("\n");
					}
				}
			}
		}
	}
	printf("\ntotal:%5d\n", n);
}

运行结果:

程序分析:

在程序各行的注释中已说明了各语句的作用,请仔细分析。请弄清楚在输出时怎样输出 "red","yellow" 等文字。要注意:输出的字符串 "red" 与枚举常量 red 并无内在联系,输出 "red" 等字符完全是人为指定的。

枚举常量的命名完全为了使人易于理解,它们并不自动地代表什么含义。例如,不因为命名为 red,就代表 “ 红色 ”,用其他名字也可以。用什么标识符代表什么含义,完全由程序设计者决定,以便于理解为原则。

有人说,不用枚举常量而用常数 0 代表 “红”,1 代表 “黄” ……不也可以吗?是的,完全可以。但显然用枚举变量 (red,yellow 等)更直观,因为枚举元素都选用了令人 “ 见名知义 ” 的名字。此外,枚举变量的值限制在定义时规定的几个枚举元素范围内,如果赋予它其他值,就会出现出错信息,便于检查。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UR5 D-H信息 | UR5结构图 | UR5连杆名关节名 | UR5模型信息 | UR5 UDFR信息

这个问题遇到好多次了&#xff0c;不管是仿真还是可视化&#xff0c;都需要我清楚的掌握ur5的URDF信息。但是看官网的Ur5.urdf真的是看的迷迷糊糊的&#xff0c;总是无法把ur5机器人的某个部位和她的名字对应起来。之前都搞不太明白&#xff0c;今天好好整理一下&#xff0c;分…

工赋开发者社区 | 做好生产线的规划与布局,能给工厂带来什么好处?

导读工厂规划布局就是对设备、工作台、物料、工装、半成品、水、电、气等的综合配置&#xff0c;主要是研究工序之间、车间之间以及工厂整体配置的合理性&#xff0c;以达到整个生产系统的人流与物流畅通化、搬运最优化、流程最优化、效率最大化的目标。“想优化工厂空间&#…

NIO Reactor模型(含代码)

概览 我们知道NIO就是调用系统内核的的select/poll/epoll方法来实现&#xff0c;这些系统内核方法会扫描或监控IO&#xff0c;每次将所有的IO的状态返回给NIO线程。让NIO线程可以选择处理读取可读状态的IO流&#xff0c;也可以选择继续监控轮询监控IO的其它状态。 reactor模型也…

【web前端开发】超详细讲解CSS盒子模型

文章目录1.盒子模型介绍2.内容3.边框4.内边距5.⭐盒子大小计算6.⭐内减模式7.外边距外边距的合并外边距的塌陷行内元素的垂直外边距8.⭐清除默认样式9.⭐版心居中1.盒子模型介绍 所有HTML元素可以看作盒子,CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c…

C#多线程锁

背景&#xff1a;再一次测试中用户和我几乎同一时刻&#xff08;不知道谁先谁后&#xff0c;估计间隔在毫秒级&#xff09;操作了系统。 用户那边反馈显示的操作日志是我登录的信息。于是开始查找问题。首先排除了全局变量先后操作被覆盖的原因。首先A账户登录&#xff0c;然后…

基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01;ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09;GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;能…

Pytorch环境配置 完整流程 从CUDA和cuDNN到Torch安装

目录1. 安装CUDA2. 安装cuDNN3. 安装Pytorch1. 安装CUDA 确认需要的CUDA版本 nvidia-smi 下载CUDA.exe CUDA下载地址 结合自己电脑的情况下载对印度个版本 安装 双击后安装&#xff0c;可以修改安装路径&#xff0c;我安装在了D盘 安装方式选择自定义 全部勾选 这里如果电脑没…

nnAudio的简单介绍

官方实现 https://github.com/KinWaiCheuk/nnAudio&#xff1b; 论文实现&#xff1a; nnAudio: An on-the-Fly GPU Audio to Spectrogram Conversion Toolbox Using 1D Convolutional Neural Networks&#xff1b; 以下先对文章解读&#xff1a; abstract 在本文中&#x…

美国站针对磁铁产品新政策16 CFR 1262详解

近日&#xff0c;亚马逊美国站公布磁铁产品&#xff08;不包括玩具&#xff09;的新政策更新公告&#xff0c;公告如下&#xff1a; 公告显示&#xff0c;由于美国消费品安全委员会&#xff08;US Consumer Product Safety Commission&#xff09;出台了新的安全规定&#xff…

海王算法(看完不会变成海王)

&#x1f4a7;学了海王算法会变成海王吗&#xff0c;它又能解决什么样的问题呢&#xff1f;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 数据结构与算法专栏的文章图文…

内存池解释及线程池(Linux)实现

1.内存池1.什么是内存池内存池是一种内存分配方式。在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继续申请新的内存。使用内存池的优点有&#xff1…

Pyspark_SQL3

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…

会声会影2023新版本功能详情讲解

会声会影2023Corel VideoStudio一款功能丰富的视频编辑软件。会声会影2023简单易用&#xff0c;具有史无前例的强大功能&#xff0c;拖放式标题、转场、覆叠和滤镜&#xff0c;色彩分级、动态分屏视频和新增强的遮罩创建器&#xff0c;超越基本编辑&#xff0c;实现影院级效果。…

【Django 网页Web开发】12. 实战项目:分页组件的封装 面向接口编程(05)(保姆级图文)

目录1. 对象的方式使用分页组件2. 项目结构3. 编写pagination.py3.1 pagination.py3.2 view.py4. bug修改之&#xff1a;url中搜索关键词q和page4.1 构造url的一个雏形4.2 修改我们的分页组件4.3 搜索小bug5. 应用分页组件&#xff0c;几行代码实现用户管理分页5.1 批量创建用户…

『 MySQL篇 』:MySQL 索引相关问题

目录 一 . 认识索引 二. 索引的数据结构 1 . B Tree vs Hash 2 . B Tree vs 二叉树/红黑树 3 . B 树 vs B树 三. 索引的使用 1. 索引分类 2. 索引用法 一 . 认识索引 当我们在查询一本书中的内容时 , 你会选择翻页每一页去查询呢 ? 还是说按照书的目录去找 ? 答案是…

springmvc(一)

SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介 请求与响应 REST风格 SSM整合(注解版) 拦截器 SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用…

微信小程序开发:微信小程序生命周期总结

前言 在微信小程序开发中&#xff0c;关于微信小程序API的使用是必备技能&#xff0c;但是关于微信小程序的生命周期也是首先要了解和掌握的知识点。尤其是现在的前端开发领域&#xff0c;关于前端的各种框架和技术都要会&#xff0c;而且微信小程序的语法就是JS的翻版&#xf…

Java 线程安全

一、什么是线程安全 当多个线程访问共享资源时&#xff0c;每个线程都会各自对共享资源进程操作&#xff0c;导致数据不一致&#xff0c;造成程序不能正确的得到结果&#xff0c;此时需要让多个线程排队访问共享资源&#xff0c;让线程安全&#xff0c;才能保证数据安全的被访问…

Jdk动态代理和Cglib动态代理的区别

一&#xff1a; 前言&#xff1a; 代理模式分为 静态代理 和 动态代理&#xff0c;今天我要讲的是动态代理的两种常见、也是被广泛使用的实现方式-------jdk动态代理 和 Cglib动态代理 二&#xff1a;Jdk动态代理实现分析&#xff1a; 结构示意图如下&#xff0c;我定义了一…
最新文章