早上在面馆吃面,女的拧开冰红茶喝了一口,看了一下瓶盖说:老公再来一瓶是什么?她老公说我也不知道,于是女的就把瓶盖往地下一丢,然后两人吃完面起身就走,刚走没几步,我就弯下腰把瓶盖捡了起来,一看是谢谢品尝~~只见那对夫妻转过脸,女的说:快点一百块钱拿来,我就跟你说肯定会有人捡的!我……
========================手动分割线==========================
一、枚举
定义:罗列出所有的可能性,每一种可能性是枚举中的一个值,叫做枚举值.
目的:提高程序的可读性、代码更易于维护
作用:将人能看懂的标识符与计算机能识别的数字建立对应关系
使用步骤:
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;
}
}
枚举值所对应的数值的变化情况:
- 默认情况下,枚举中每个元素的基础类型是int,可以使用冒号指定另一种整数值类型;
- 枚举值默认从0开始;
- 枚举值以指定的整数值为主,如果没有指定,则在上一个枚举值的对应整数值的基础上加1;
- 枚举值必须在元素的基础类型表示的有效范围内!
- 枚举成员不能相同,但枚举的值可以相同。
- 枚举值也可以使用运算符进行操作,但很少使用。
因此,枚举值可以拿来进行运算,比如:
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,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明