什么是结构体
用代码描述一个学生:
姓名: 小明
性别: 男
年龄: 15
学校: 北京四中
手机号: 13901234567
描述俩个学生
string name01 = "xiaoming";
char sex01 = 'M';
int age01 = 15;
string school01 = "北京四中";
string phoneNumber01 = "13901234567";
string name02 = "xiaohong";
char sex02 = 'F';
int age02 = 14;
string school02 = "北京八中";
string phoneNumber02 = "13903153150";
这样定义会很麻烦, 但是基本内容一样, 所以可以用结构体来声明
结构体声明
结构体是自定义类型
Struct 结构体名 {结构体内容}
// 学生结构
sturct Student
{
public string name;
public char sex;
public int age;
public string school;
public string phoneNumber;
}
注意: 结构体内字段声明不能有初值
创建结构体变量
结构体是值类型
Student xiaoming;
给结构体内变量赋值
使用点运算 (.)
xiaoming.name = "xiaoming";
xiaoming.sex = 'M';
xiaoming.age = 15;
xiaoming.school = "北京四中";
xiaoming.phoneNumber = "13901234567";
结构体的构造函数
构造函数是构造结构体时,调用的函数;
构造函数在结构体内创建;
自定义的构造函数必须给所有的字段进行初始化赋值
public Student (string name, char sex, int age, string school, string phoneNumber)
{
this.name = name;
this.sex = sex;
this.age = age;
this.school = school'
this.phoneNumber = phoneNumber;
}
结构体的初始化 (调用构造函数)
调用默认的构造函数
Student xiaomei = new Student ();
调用自定义的构造函数
Student xiaogang = new Student
(
"xiaogang", 'M', 16,
"人大附中", "13901234567"
);
练习
创建英雄装备结构体,包含名称,攻击力加成,法术强度加成,血量加成
1、有5个装备保存在结构体数组当中,编程找出血量加成最高者
2、对装备数组按照攻击力加成排序并使装备按照攻击力加成升序进行信息打印
#region 练习1: 有5个装备保存在结构体数组当中,编程找出血量加成最高者
HeroEquip wjzr = new HeroEquip("无尽战刃", 110, 0, 0, EquipType.ADEquip);
HeroEquip qxzr = new HeroEquip("泣血之刃", 100, 0, 500, EquipType.ADEquip);
HeroEquip bzzz = new HeroEquip("霸者重装", 0, 0, 2000, EquipType.HPEquip);
HeroEquip sszs = new HeroEquip("噬神之书", 0, 180, 1000, EquipType.APEquip);
HeroEquip qzzj = new HeroEquip("形昭之鉴", 0, 0, 800, EquipType.Other);
// 声明结构体数组存储这些装备
HeroEquip[] heroEquips = {wjzr, qxzr, bzzz, sszs, qzzj};
// 设置初始血量最大值
float maxHPBuff = heroEquips[0].hpAddition;
// 初始血量最大值的装备名称
string maxHPEquipName = heroEquips[0].name;
HeroEquip maxHPEquip = heroEquips[0];
// 找血量最大
for (int i = 0; i < heroEquips.Length; i++)
{
if (maxHPBuff < heroEquips[i].hpAddition)
{
// 更新最大值
maxHPBuff = heroEquips[i].hpAddition;
// 更新最大值的装备名称
maxHPEquipName = heroEquips[i].name;
}
// 如果声明结构体
if (maxHPEquip.hpAddition < heroEquips[i].hpAddition)
{
maxHPEquip = heroEquips[i];
}
}
Console.WriteLine(maxHPEquipName + "\t" + maxHPBuff);
Console.WriteLine("血量加成最高的装备是:" + maxHPEquip.name + "\n" + "血量加成为:" + maxHPEquip.hpAddition);
#endregion
#region 练习2: 对装备数组按照攻击力加成排序并使装备按照攻击力加成升序进行信息打印
for (int i = 0; i < heroEquips.Length; i++)
{
for (int j = 0; j < heroEquips.Length - i - 1; j++)
{
if (heroEquips[j].adAddition > heroEquips[j + 1].adAddition)
{
HeroEquip temp = heroEquips[j];
heroEquips[j] = heroEquips[j + 1];
heroEquips[j + 1] = temp;
}
}
}
for (int i = 0; i < heroEquips.Length; i++)
{
Console.WriteLine(heroEquips[i].adAddition + "\t" + heroEquips[i].name);
}
#endregion
// 装备类型
enum EquipType
{
ADEquip,
APEquip,
HPEquip,
Other
}
// 英雄装备
struct HeroEquip
{
public string name; // 名称
public float adAddition; //攻击力
public float apAddition; //法术强度
public float hpAddition; //血量
public EquipType equipType;
public HeroEquip(string name, float adBuff, float apBuff,
float hpBuff, EquipType equipType)
{
// 给所有字段赋初值
this.name = name;
adAddition = adBuff;
apAddition = apBuff;
hpAddition = hpBuff;
this.equipType = equipType;
}
}