复杂数据类型(一)

复杂数据类型(一)

类型特点:

1.数据集合:一般是多个数据(变量)集合在一起构成的数据

2.自定义:一般可以自己取名字,可以自定义的数据(变量)

具体特点

枚举:整形常量的集合,可以自定义

数组:任意变量类型顺序存储的数据

结构体:任意变量的数据集合,可以自定义

一.枚举

1.基本概念

枚举是什么

枚举是一个比较特别的存在,它是一个被命名的整形常量的集合(不会被改变),一般用它来表示状态类型等等

申明枚举和申明枚举变量

申明枚举:相当于是创建一个自定义的枚举类型

申明枚举变量:使用申明的自定义枚举类型创建一个枚举变量

申明枚举语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum E_自定义枚举名;
//枚举名以E或者E_开头,作为我们的命名规范.
{
自定义枚举项名字,//枚举中包裹的整形常量,名字是我们自己取的,第一个默认值是0,下面会依次累加。
自定义枚举项名字1,//默认累加,为1
自定义枚举项名字2,//默认累加,2
}
enum E_自定义枚举名;
//枚举名以E或者E_开头,作为我们的命名规范.
{
自定义枚举项名字 =5,//第一个枚举项的默认值变成5了;
自定义枚举项名字1,//默认累加,为6;
自定义枚举项名字2,//默认累加,为7;
自定义枚举项名字3 =100//允许在中途改变枚举项的值;
自定义枚举项名字4//改完之后仍然遵循累加,为101;
}

2.在哪里申明枚举

在namespace语句块中(常用)

class语句块中,struct语句块中(不常用)

注意:枚举不能在函数语句块中申明!!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace Lesson1
{
//在这里申明枚举;
enum E_MonsterType
{
Normal,
Boss,
}
internal class Program
{
static void Main(string[] args)
{
//函数语句块中申明会报错!
Console.WriteLine("Hello, World!");
}
}
}

3.枚举的使用(关于申明枚举与枚举变量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace Lesson1
{
enum E_MonsterType
{
Normal,
Boss,
}
internal class Program
{
static void Main(string[] args)
{
E_MonsterType play = E_MonsterType.Normal;
//申明枚举变量
//=右边为namespace里面的整形常量,通过枚举名识别。
//play为自定义的名字。
//作用:声明了一个枚举类型的变量,值等于normal。
if(play==E_MonsterType.Normal)
{
相对应的逻辑;
}else if(play==E_MonsterType.Boss)
{
其他对应逻辑;
}
}
}
}

总结:申明枚举变量

自定义的枚举类型 变量名=默认值(自定义的枚举类型.枚举项)

用来配合条件分支语句来使用。

Ps:枚举和switch是“天生一对”

1
2
3
4
5
6
7
8
9
10
11
12
//接上文的背景,在函数框框内
E_MonsterType monster =E_MonsterType.Boss;
switch (monsterType)
{
case E_MonsterType.Normal;
break;
case E_MonsterType.Boss;
break;
default:
break;
//这些会自动补齐,很方便的
}

4.枚举的类型转换

只能转两个!!!

枚举和int互转

1
2
3
4
5
6
7
8
9
10
11
//接上文的背景,在函数框框内
E_MonsterType monster =E_MonsterType.Boss;
int i=(int)monster;
//枚举转int(monster代表枚举类型,赋值给int类型的i)
Console.WriteLine(i);
//输出1,代表Boss的数字
int t=int Parse(Console.ReadLine());
monster=(E_MonsterType)t;
//t是变量,因此要多一步括号强转。
monster=0;
//int转枚举(0代表int类型,直接赋给枚举类型)

枚举和string相互转换

1
2
3
4
5
6
7
8
9
10
11
12
//接上文的背景,在函数框框内
E_MonsterType monster =E_MonsterType.Boss;
string str=monster.Tostring();
Console.WriteLine(str);
//枚举转成string类型。
//会输出Boss这个字符串(把枚举项的名字转换成字符串,输出枚举项的名字)
monster = (E_MonsterType)Enum.parse(typeof(E_MonsterType),"Boss");
Consloe.WriteLine(playerType);
//括号内第一个参数表示要转换成什么样的枚举类型(因为枚举是自定义的),第二个参数填用于转换的对应枚举项的字符串,
//Enmu表示一个类,类里面有一个parse的函数,可以把字符串转换成枚举。
//转换完毕后是一个通用的类型,还要记得括号强转,转化成你想要的目标枚举类型。
//最后输出BOSS。

5.枚举的作用

在游戏开发中,对象很多时候会有许多状态,比如玩家有一个动作状态,我们需要用一个变量或者标识,来表示当前玩家是处于的是哪一种状态。

枚举可以帮助我们清晰的分清楚状态的含义。

备注:在写枚举时,你可以用到三杠注释,这样在你申明枚举类型时鼠标移到类型上会有提示,方便阅读。

(枚举的题目实例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
namespace Lesson1
{
enum E_SexType
{
Man,
Woman,
}
enum E_zhiye
{
zhanshi,
fashi,
lieren,
}
internal class Program
{
static void Main(string[] args)
{
try
{
string sex = " ";
string zhi = " ";
string jineng = " ";
Console.WriteLine("请输入性别(男性0,女性1):");
E_SexType sex1 = (E_SexType)int.Parse(Console.ReadLine());
//输入转成枚举类型。
int akt = 0;
int def = 0;
switch (sex1)
{
case E_SexType.Man:
sex = "男性";
akt += 50;
def += 100;
break;
case E_SexType.Woman:
sex = "女性";
akt += 150;
def += 20;
break;
}
Console.WriteLine("请输入职业(战士0,法师1,猎人2):");
E_zhiye zhiye=(E_zhiye)int.Parse(Console.ReadLine());
switch (zhiye)
{
case E_zhiye.zhanshi:
zhi = "战士";
akt += 20;
def+= 100;
jineng = "冲锋";
break;
case E_zhiye.fashi:
zhi = "法师";
akt += 200;
def += 10;
jineng = "奥术冲击";
break;
case E_zhiye.lieren:
zhi = "猎人";
akt += 120;
def += 30;
jineng = "假死";
break;
}
Console.WriteLine("你选择了\"{0}{1}\",攻击力:{2},防御力:{3},职业技能:{4}。",sex,zhi,akt,def,jineng);
}catch
{
Console.WriteLine("请输入数字:");
}
}
}
}

二.数组

1.一维数据

基本概念

数组是存储一组相同类型数据的集合

数组分为一维,多维,交错数组

一般情况下,一维数组就简称数组。

数组的申明

第一种申明写法:

变量类型[] 数组名;(该申明的特点:只是申明了一个数组,但是并没有对这个数组进行分配内存,也没有初始化。

变量类型可以是我们学过的或者没学过的所有变量类型(包括枚举)。

1
2
int[] arr1;
bool[] arr6;
第二种申明写法:

变量类型[] 数组名 = new 变量类型[数组的长度];

不同于第一种的是,在定义的时候它其实以及给数组分配内存了,也进行初始化了。相当于开了五个房间,但是房间里面的值默认为0.

1
int[] arr3 =new int[5];
第三种申明写法:

变量类型[] 数组名 = new 变量类型[数组的长度]{内容1,内容2,。。。。。。}(数量要相对应}。

1
int[] arr3 =new int[5] {12345};
第四种申明写法:

变量类型[] 数组名 = new 变量类型[]{内容1,内容2,。。。。。。}。

后面的内容决定了数组的长度。

1
int[] arr3 =new int[] {12345,6,7};
第五种申明写法:

变量类型[] 数组名 = {内容1,内容2,。。。。。。}。(内容一定要和数组名对应)

1
2
int[] arr3 ={12345,6,7};
bool[] arr4={true.false};

数组的使用

数组的长度

如何获取数组的长度?

1
2
int[] array={1,2,3,4,5};
Console.WriteLine(array.Length);
获取数组中的元素

数组中的下标和索引从0开始,不能越界。

1
2
Console.WriteLine(array[0]);
Console.WriteLine(array[2]);
修改数组中的元素
1
2
array[0]=99;
//重新赋值即可,类型要相同。
遍历数组

通过循环快速获取数组中的每一个元素。

1
2
3
for(int i=0;i<array.Length;i++){
Console.WriteLine(array[i]);
}
增加数组的元素

注意:数组初始化之后,是不能够直接添加新的元素的,要增加,得做一个“新家”再“搬过去”。

1
2
3
4
5
6
7
8
int[]array2=new int[6];
for(int i=0;i<array.Length;i++){
array2[i]=array[i];
}
array=array2;//很重要!!!!!!!!!!!!!!!!!
//将array指向一片新的内存空间了,原内存空间作废。
array[5]=999;
//就增加了一个新的元素.
删除数组的元素

与增加相似,数组初始化之后,也不能删减元素,还是要搬家。与上文类似,不多做代码块叙述。(数组遍历长度应为新数组的长度,因为比较小)(i<array3.Length)

查找数组中的元素

只有通过遍历才可以,没得说。


复杂数据类型(一)
https://gaster44.github.io/2023/11/11/复杂数据类型(一)/
作者
huangjinhong
发布于
2023年11月11日
许可协议