laiyuou 发表于 2021-11-14 22:14

c语言学习的第7天:枚举类型的学习,枚举类型排列组合的例子

枚举类型:枚举类型的定义是:在这种类型中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。
枚举类型是一个钟基本数据类型和int,float double这种基本类型一样,而不是一种构造类型,因为他不能再分解为任何基本类型
枚举类型的定义和枚举变量的说明:
枚举类型的定义的一般形式为;
enum枚举名{枚举表};// 在枚举表中应该罗列出所用可用的值。这些值也被称为枚举元素

2.枚举变量的说明:
如同结构和联合一样,枚举变量也可以用不同的方式说明,即先定义后说明,同时定义说明或者直接说明
例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat};
enum weekday a, b, c;
或者:
enum weekday{Sun,Mon,Tue,Wed,The,Fri,Sat} a,b,c;//a,b,c为枚举变量
或者:
enum {Sun,Mon,Tue,Wed,The,Fri,Sat};

枚举变量的赋值和使用:
枚举类型在使用中有以下规定:
1.枚举值是常量不是变量。不能再程序中用赋值语句再对他赋值
2.枚举元素本身有系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2,3,4....

例子1:
```
int main()
{
        enum weekday
        {
                Sun,Mon,Tue,Wed,Thu,Fri,Sat
        }a,b,c;
        a = Sun;
        b = Mon;
        c = Tue;
        printf("%d,%d,%d\n", a, b, c);
        return 0;
}
```
我们只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量;如果一定要把数值赋予给枚举变量则必须强制转换类型
如:a =(enum weekday)2;
枚举元素不是字符常量也不是字符串常量,使用时不要加单,双引号
例子2
```
enum body
{
        a, b, c, d
}month, j;
int main()
{

        int i;
        j = a;
        for (i = 1; i <= 30; i++)
        {
                month = j;
               
                j++;//对这个枚举类型变量j执行j++操作,想要指向下一个枚举元素,在vs中无法实现,需要自己编写一个函数
                if (j > d)        j = a;
        }
        for (i = 1; i <= 30; i++)
        {
                switch (month)
                {
                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");

        return 0;
}
```
例子3:
```
int main()
{
        enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun}day;
        int i = 0;
       
        while (1) {
                printf("请输入一个数值:\n");
                scanf_s("%d", &day);
                if (day == 0)break;
                switch (day)
                {
                case Mon:puts("Monday"); break;
                case Tues:puts("Thuesday"); break;
                case Wed:puts("Wednesday"); break;
                case Thurs:puts("Thursday"); break;
                case Fri:puts("Friday"); break;
                case Sat:puts("Saturday"); break;
                case Sun:puts("Sunday"); break;
                default:puts("Error");
                }
                printf("如果想退出请输入0\n");
        }
       
        return 0;
}
```
1.需要注意的是Mon,Tues,Wed这些标识的作用是范围的全局变量(严格来说就是main主函数内部),不能再定义与他们名字
相同的变量。
2.Mon,Tues,Wed等都是常量,不能对他们赋值,只能将他们的值赋给其他变量

例子4:
``int main()
{
        enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun }day;
        int i = 0;

        while (1) {
                printf("请输入一个数值:\n");
                scanf_s("%d", &day);
                if (day == 0)break;
                switch (day)
                {
                case 1:puts("Monday"); break;
                case 2:puts("Thuesday"); break;
                case 3:puts("Wednesday"); break;
                case 4:puts("Thursday"); break;
                case 5:puts("Friday"); break;
                case 6:puts("Saturday"); break;
                case 7:puts("Sunday"); break;
                default:puts("Error");
                }
                printf("如果想退出请输入0\n");
        }

        return 0;
}

枚举类型变量需要存放的是一个整数,那么他的长度和int长度应该是相同的
例子:
```
int main()
{
        enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun}day = Mon;
        printf("%d,%d,%d,%d,%d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed),sizeof(int));
        return 0;
}

```
例子5枚举类型的排列组合
```
enum yaunsu
{
        a,b,c,d,e,f,g
};
int main()
{
        int i = 0,j = 0, k = 0;
        void pailie(int, int, int);
        pailie(i, j, k);
        return 0;
}
void pailie(int i, int j, int k)
{
        int sum = 0, loop = 0, loop1;
        for (i = a; i <= g; i++)
        {
                for (j = a; j <= g; j++)
                {
                        if (i != j)
                        {
                                for (k = a; k <= g; k++)
                                {
                                        if (k != i && k != j)
                                        {
                                                sum++;
                                                printf("第%d中组合方式为:", sum);
                                                for (loop = 0; loop < 3; loop++)
                                                {
                                                        switch (loop)
                                                        {
                                                        case 0:loop1 = i;
                                                                break;
                                                        case 1:loop1 = j;
                                                                break;
                                                        case 2:loop1 = k;
                                                                break;
                                                        default:
                                                                break;
                                                        }
                                                        switch (loop1)
                                                        {
                                                        case 0:printf("a ");
                                                                break;
                                                        case 1:printf("b ");
                                                                break;
                                                        case 2:printf("c ");
                                                                break;
                                                        case 3:printf("d ");
                                                                break;
                                                        case 4:printf("e ");
                                                                break;
                                                        case 5:printf("f ");
                                                                break;
                                                        case 6:printf("g ");
                                                                break;
                                                        default:break;

                                                        }
                                                }
                                                //Sleep(1000);
                                                printf("\n");
                                        }
                                }
                        }
                }
        }
}
```
学习的内容都是来源于网上的资料以及书本,发出来只是希望能够记录一下学习的过程,也希望能够起到交流学习的作用。有可能很多内容都是楼主自己为了巩固分享到许多重复的内容,希望莫怪。。而且楼主比较笨555...,很多东西都是花费了很多时间的去查资料,看视频去理解的,现在有很多都不是很理解,希望一切的努力都不会被辜负,与此共勉。

punkla 发表于 2021-11-14 22:41

多谢楼主分享,谢谢。

blackboard 发表于 2021-11-14 22:58

有图有标注

curio 发表于 2021-11-14 23:35

感觉比我聪明555,我是又笨又懒得学

kanxue2018 发表于 2021-11-14 23:43

多练习,做小项目,进步神速

harmonyOS 发表于 2021-11-15 00:10

楼主是看的谁的教程?我看的韦东山的,目前一头雾水

shilong 发表于 2021-11-15 07:06

贵在坚持,他日必成大器,谢谢分享。

fengbu401 发表于 2021-11-15 08:30

贵在坚持,他日必成大器,谢谢分享。

tlf 发表于 2021-11-15 08:44

gamelover9527 发表于 2021-11-15 08:48

坚持下去,加油~
页: [1] 2
查看完整版本: c语言学习的第7天:枚举类型的学习,枚举类型排列组合的例子