C#基础- 枚举和结构体-07

早上在面馆吃面,女的拧开冰红茶喝了一口,看了一下瓶盖说:老公再来一瓶是什么?她老公说我也不知道,于是女的就把瓶盖往地下一丢,然后两人吃完面起身就走,刚走没几步,我就弯下腰把瓶盖捡了起来,一看是谢谢品尝~~只见那对夫妻转过脸,女的说:快点一百块钱拿来,我就跟你说肯定会有人捡的!我……


========================手动分割线==========================

一、枚举

  • 定义:罗列出所有的可能性,每一种可能性是枚举中的一个值,叫做枚举值.

  • 目的:提高程序的可读性、代码更易于维护

  • 作用:将人能看懂的标识符与计算机能识别的数字建立对应关系

  • 使用步骤:
    1.定义枚举(定义在类的外面)
    2.定义枚举变量
    3.使用变量

  • 枚举定义格式:

             enum  枚举名称 {
    
                 枚举值1,// 成员之间以逗号隔开
    
                 枚举值2...  // 最后一个成员后面的逗号可以省略
    
             } // 大括号后的分号可以省略
    
  • 注意:枚举是一种自定义的数据类型,必须先定义再使用。

在NameSpace中定义:

练习1:定义一个季节枚举

 enum Season
    {
        Spring,
        // 手动指定枚举的值
        Summer = 4,
        Fall,
        Winter = 4,
        Test
    };分号可写可不写

枚举在Main方法内的调用:

        static void Main(string[] args)
        {
            // 定义一个枚举类型变量
            Season a = Season.Winter;
            // 输出枚举值
            Console.WriteLine(a);
            // 输出枚举变量对应的整数值
            Console.WriteLine((int)a);
        }

练习2:枚举列出一周七天

 enum Days : uint
    {
        Mondey = 1,
        Tues,
        Wen,
        Th,
        Fir,
        Sat,
        Sunday
    }

练习4:用户在控制台输入一个整数,输出对应的在星期几去做什么事情

        static void Main(string[] args)
        {
            Console.WriteLine("请输入您想去的日期(1表示周一,依次类推):");

            int input = int.Parse(Console.ReadLine());// 接收输入的值
            Days day = (Days)input; // 将输入的值转换为对应的枚举值

            switch (day)
            {
                case Days.Mondey:
                    Console.WriteLine("打瞌睡");
                    break;

                case Days.Tues:
                    Console.WriteLine("去工大看妹子");
                    break;

                case Days.Wen:
                    Console.WriteLine("去郑大看妹子");
                    break;

                case Days.Th:
                    Console.WriteLine("去金尊足道");
                    break;

                case Days.Fir:
                    Console.WriteLine("到庖丁堂大吃");
                    break;

                case Days.Sat:
                    Console.WriteLine("通宵撸代码");
                    break;

                case Days.Sunday:
                    Console.WriteLine("睡觉");
                    break;

                default:
                    Console.WriteLine("屌丝,不知道一周几天吗?");
                    break;
            }
        }

枚举值所对应的数值的变化情况:

  1. 默认情况下,枚举中每个元素的基础类型是int,可以使用冒号指定另一种整数值类型;
  2. 枚举值默认从0开始;
  3. 枚举值以指定的整数值为主,如果没有指定,则在上一个枚举值的对应整数值的基础上加1;
  4. 枚举值必须在元素的基础类型表示的有效范围内!
  5. 枚举成员不能相同,但枚举的值可以相同。
  6. 枚举值也可以使用运算符进行操作,但很少使用。

因此,枚举值可以拿来进行运算,比如:

            Days dd = Days.Mondey;
            dd++;
            Console.WriteLine (++dd);

扩展-枚举常用的方法:

            // 1.获取所有的枚举值
            foreach (var i in Enum.GetValues(typeof(Season))) {
                Console.WriteLine ((int)i);
            }

            // 2.获取所有的枚举成员名称
            foreach (var i in Enum.GetNames(typeof(Season))) {
                Console.WriteLine (i);
            }

            // 3.获取枚举的某一值对应的名称
            // 第一种形式如果越界,就返回空字符串
            Console.WriteLine (Enum.GetName (typeof(Season), 5));
            // 第二种形式如果越界,就返回给定的枚举值
            string r = ((Season)5).ToString ();
            Console.WriteLine (r);

二、结构体

2.1 结构体概述

1.是一种自定义的数据类型,和int、float一样,可以用来定义变量;
2.是一个大容器,可以用来快速定义多个变量,只不过变量组合在一起组成一个有意义的元素;
3.可以存储不同类型的数据,比数组灵活。

2.2结构体的定义

  • 在Namespace下定义,定义格式:
struct 结构体名
{
      访问修饰符 数据类型 成员名1;
      访问修饰符 数据类型 成员名2;
      ...
}
  • 定义结构体时,只定义成员变量,不赋初值
struct Student
{
    // 姓名 结构体成员之间以分号隔开
    public string name;
    // 年龄
    public int age;
    // 性别
    public string gender;
}

练习1:定义一个点结构体,包含成员(横坐标x, 纵坐标y)

struct Point
{
    public float x;
    public float y;
};

练习2:定义一个矩形结构体,包含成员(长length,宽width)

 struct Rect
 {
        //长
        public float length;
        //宽
        public float width;
 };

2.3结构体在Main函数中的应用

  • 结构体变量:由结构体类型修饰的变量
  • 定义格式:结构体名称 变量名
  • 访问结构体成员,使用点语法:结构体变量名.成员变量名

2.3.1 手动初始化

            // 如果想使用某个成员,必须先赋值
            Student stu1;
            stu1.name = "杰克";
            stu1.age = 18;
            stu1.gender = "m";

            Console.WriteLine (stu1.name);
            Console.WriteLine (stu1.age);

2.3.2 使用new关键字来初始化结构体成员

  • 实质是:调用构造方法来初始化结构体成员, 如果不赋值,会提供一个默认值
            Student stu2 = new Student ();
            stu2.name = “柔斯";

            Console.WriteLine (stu2.name);
            Console.WriteLine (stu2.age);

2.4 结构体赋值

2.4.1 单一成员赋值

            stu2.name = stu1.name;
            stu2.age = stu1.age;

            Console.WriteLine ("name = {0}, age = {1}", stu2.name, stu2.age);

2.4.2 整体赋值

  • 注意:此时stu1的所有成员必须全部赋值才能使用
            Student stu3 = stu1;

            Console.WriteLine ("name = {0}, age = {1}", stu3.name, stu3.age);

练习1:定义点结构体变量,并赋值输出

            Point p;

            p.x = 3;
            p.y = 4;

            Console.WriteLine ("点的坐标为:({0}, {1})", p.x, p.y);

练习2:定义矩形结构体变量,并赋值输出

            Rect r = new Rect ();

            r.width = 8;
            r.length = 9;

            Console.WriteLine ("矩形的长和宽为:({0}, {1})", r.width, r.length);

2.5 结构体与数组

  • 由结构体类型修饰的数组,称为结构体数组

2.5.1 创建学生结构体,包含姓名、年龄、学号、分数等信息, 并赋予其值,输出结构体成员的值;

首先在 NameSpace下创建结构体:

  struct Stu
    {
        // 姓名
        public string name;

        // 年龄
        public int age;

        // 学号
        public int number;

        // 成绩
        public float score;
    }

其次在Main函数中:

        Stu s = new Stu ();
        s.name = "小明";
        s.age = 9;
        s.number = 101;
        s.score = 59.9f;

        Console.WriteLine ("姓名:{0},年龄:{1},学号:{2},成绩:{3}", s.name, s.age, s.number, s.score);

2.5.2 有5名学生保存在结构体数组中,编程找出分数最高者, 输出该学生的全部信息;

        Stu[] arr = new Stu[5];// 声明一个学生结构体数组,并指定能存放5个学生

        string[] names = { "张三", "李四", "王五", "赵大", "钱二" };// 所有人的名字
        Random ageR = new Random ();// 年龄随机数
        Random scoreR = new Random ();// 成绩随机数

        // 使用循环,分别为5名学生赋值
        for (int i = 0; i < 5; i++) {
            arr [i].name = names [i];
            arr [i].age = ageR.Next (15, 25);
            arr [i].number = i + 1;
            arr [i].score = scoreR.Next (50, 100);
        }

        Console.WriteLine ("\n学员的全部信息:");
        for (int i = 0; i < 5; i++) {
            Console.WriteLine ("姓名:{0},年龄:{1},学号:{2},成绩:{3}", arr [i].name, arr [i].age, arr [i].number, arr [i].score);
        }

1、求出这五个学生,分数最高的同学,输出这个同学所有的信息。
2、将所有学生按照分数从大到小的顺序排列,然后输出所有同学信息。查找分数最高者,并输出其信息

        Stu scoreH = new Stu ();
        foreach (Stu temp in stuArray) {
            // 比较的是每个人的分数,得到的整个人的信息
            scoreH = scoreH.score < temp.score ? temp : scoreH;
        }

        Console.WriteLine ("成绩最高者的信息:\n姓名:{0},年龄:{1},学号:{2},成绩:{3}", scoreH.name, scoreH.age, scoreH.number, scoreH.score);

2.5.3 对上述5名学生数组按分数进行排序,并输出

        for (int i = 0; i < 5 - 1; i++) {
            for (int j = 0; j < 5 - 1 - i; j++) {
                if (stuArray [j].score > stuArray [j + 1].score) {
                    // 注意:比较的是成绩,但排序的是学生!!
                    Stu temp = stuArray [j];
                    stuArray [j] = stuArray [j + 1];
                    stuArray [j + 1] = temp;
                }
            }
        }

        Console.WriteLine ("\n按分数排序后:");
        for (int i = 0; i < 5; i++) {
            Console.WriteLine ("姓名:{0},年龄:{1},学号:{2},成绩:{3}", stuArray [i].name, stuArray [i].age, stuArray [i].number, stuArray [i].score);
      }

2.6 构造方法 - 一次能为多个成员赋值,简化代码

  • 使用new关键字初始化结构体变量时,会调用默认的构造方法
  • 注意:自定义初始化方法,必须为全部成员赋值
2.6.1 使用自定义构造方法定义一个Stu变量
  • 先在刚才自定义的Stu结构体中添加构造方法

  • 自定义构造方法 -- 需要在自带构造方法的基础上,添加参数,方便赋值

    public Stu (string _name, int _age, int _number, float _score)
      {
          name = _name;
          age = _age;
          number = _number;
          score = _score;
      }
    
  • 在Main中添加:

         Stu student = new Stu ("老汉", 19, 123, 20.5f);
         Console.WriteLine ("姓名:{0},年龄:{1},学号:{2},成绩:{3}", 
             student.name, student.age, student.number, student.score);
    

2.6.2 使用自定义构造方法,定义一个Point结构体变量

  • 先在刚才定义的Point结构体中添加如下构造方法

         public Point(float p1, float p2) {
    
           x = p1;
    
           y = p2;
    
         }
    
  • 再在Main中添加

          Point ss = new Point (2f, 3f);
    
          Console.WriteLine (ss.x + ", " + ss.y);
    

2.7 结构体嵌套

  • 定义新的结构体,并使用之前的结构体作为其中一个变量

练习4:定义一个立方体结构体,包含成员(长length,宽width,高height)

struct Cube
{
    public Rect rect;
    public float heigth;

    // 添加自定义构造方法
    public Cube (Rect r, float h)
    {
        rect = r;
        heigth = h;
    }
};

在Main函数中:

        Rect rec;
        rec.length = 13f;
        rec.width = 3f;

        Cube cube = new Cube (rec, 2.5f);

        Console.WriteLine (cube.rect.length);

综合练习:定义一个英雄结构体,包含成员姓名、血量、创建日期,其中,创建日期是一个单独的结构体。
创建5个英雄,分别为其属性赋值,并输出所有英雄的全部信息。

自行练习,做题过程中有疑问可在群内交流。答案见下节。

本次讲解就到这里,有关技术问题请小伙伴们添加QQ群:941928511,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容