六、复杂数据类型
1、变量类型:
int double string char bool decimal
变量的使用规则:先声明再赋值最后使用
2、Camel Pascal
3、运算符
赋值运算符:=
复合赋值运算符:+= -= *= /= %= sum+=age; sum=sum+age
算数运算符:+ - * / % ++ --
关系运算符:> < >= <= == !=
逻辑运算符:&& || !
4、C#中的语法结构
分支结构:if if-else
选择结构:
while do-while for
5、常量
声明常量的语法:
const 变量类型 变量名=值;
例:const int number = 20; //常量不能够被重新赋值
6、枚举
语法:
[public] enum 枚举名
{
值1,
值2,
值3,
……
}
public:访问修饰符。公开的公共的,哪都可以访问。
enum:关键字,声明枚举的关键字
枚举名:要符合Pascal命名规范
将枚举声明到命名空间的下面,类的外面,表示这个命名空间下,所有的类都可以使用这个枚举。
枚举就是一个变量类型,int--double string decimal.
只是枚举声明、赋值、使用的方式跟那些普通的变量类型不一样。
我们可以将一个枚举类型的变量跟int类型和string类型互相转换。
枚举类型默认是跟int类型相互兼容的,所以可以通过强制类型转换的语法相互转换。
当转换一个枚举中没有的值的时候,不会抛异常,而是直接将数字显示出来。
枚举同样也可以跟string类型互相转换,如果将枚举类型转换成string类型,则直接调用ToString()。
如果将字符串转换成枚举类型则需要下面这样一行代码:
(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串");
如果转换的字符串是数字,则就算枚举中没有,也不会抛出异常。
如果转换的字符串是文本,如果枚举中没有,则会抛出异常。
例:
namespace _03_枚举 { //声明枚举 public enum Gender { 男, 女 } public enum Sesons { 春, 夏, 秋, 冬 } public enum QQState { ONLine, OffLine, Leave, Busy, QMe } class Program { static void Main(string[] args) { const int number = 20; //常量不能够被重新赋值 //枚举 //XX大学管理系统 //姓名 性别 年龄 系别 //性别 //枚举使用 Gender gender = Gender.男; Sesons seson = Sesons.春; QQState state = QQState.ONLine; //枚举类型默认可以和int类型相互转换 枚举类型跟int类型是兼容的 //枚举--int int n = (int)state; Console.WriteLine(state); Console.WriteLine(n); //int--枚举 int n1 = 3; QQState state1 = (QQState)n1; Console.WriteLine(state1); //枚举--string string s = "0"; //调用Parse()方法的目的就是为了让他帮助我们将一个字符串转换成对应的枚举类型 //参数1获得转换的枚举类型,typeof拿到枚举类型;参数2需转换的字符串 QQState state2 = (QQState)Enum.Parse(typeof(QQState), s); Console.WriteLine(state2); //枚举练习:提示用户选择一个在线状态,我们接受,并将用户的输入转换成枚举类型。再次打印到控制台中 Console.WriteLine("请选择一个状态:"); string s2 = Console.ReadLine(); QQState S3 = (QQState)Enum.Parse(typeof(QQState), s2); Console.ReadKey(); } } }
7、所有的类型都能够转换成string类型,调用ToString()。
8、结构
可以帮助我们一次性声明多个不同的变量。
语法:
[public] struct 结构名
{
成员; //字段
}
变量只可以存储一个值,字段可以存储多个值。
namespace _03_结构 { public struct Person { public string _name; //字段,和变量一样存储数据,但是可以存多个值 public int _age; public Gender _gender; //声明枚举类型 } public enum Gender { 男, 女 } public struct MyColor { public int _red; public int _green; public int _blue; } class Program { static void Main(string[] args) { //结构 Person zsPerson; zsPerson._name = "张三"; zsPerson._age = 21; zsPerson._gender = Gender.男; Person lsPerson; lsPerson._name = "李四"; lsPerson._age = 23; lsPerson._gender = Gender.女; Console.WriteLine(zsPerson._name); Console.WriteLine(lsPerson._name); //定义一个结构叫MyColor,有三个成员,分别定义为int类型的red,green,blue //声明一个MyColor类型的变量,并对其成员赋值,使MyColor可以表示成一个红色 MyColor myColor; myColor._red = 255; myColor._blue = 0; myColor._green = 0; } } }
9、数组
一次性存储多个相同类型的变量。
语法:数组类型[] 数组名=new 数组类型[数组长度]
当写了上面这样一行代码之后,就在内存中开辟了连续的10块空间,我们管每一个块称之为这个数组的元素。如果要访问到数组中的某一元素,需要通过这个元素的下标或者索引去访问。
数组长度一旦固定,不可以改变。
//数组 //数组类型[] 数组名=new 数组类型[数组长度] int[] nums = new int[10]; string[] str = new string[10]; bool[] bools = new bool[10]; //数组的声明方式 int[] nums2 = { 1, 2, 3, 4, 5 }; int[] nums3 = new int[3] { 1, 2, 3 }; int[] num4 = new int[] { 1, 2, 3 }; //练习一:从一个整数数组中取出最大的整数、最小的整数,总和,平均值 int[] nums5 = {1,2,3,4,5,6,7,8,9,0 }; int max = nums5[0]; int min = nums5[0]; int sum = 0; //或者max 和 min这样定义 int max1 = int.MinValue; //定义的时候比每一个值都要小,以确保找到最大值 int min1 = int.MaxValue; for (int i = 0; i < nums5.Length;i++ ) { if(nums5[i]>max) { max = nums5[i]; } if (nums5[i] < min) { min = nums5[i]; } sum = sum + nums5[i]; } Console.Write("最大值为{0},最小值为{1},总和为{2},平均值为{3}", max, min, sum, sum / 10);
//练习二:反转
string[] names = { "z", "b", "c", "d", "e", "f", "g" };
for (int i = 0; i < names.Length / 2;i++ )
{
string temp = names[i];
names[i] = names[names.Length - 1 - i];
names[names.Length - 1 - i] = temp;
}
for (int i = 0; i < names.Length;i++ )
Console.WriteLine(names[i]);
10、冒泡排序:就是将一个数组中的元素按照从大到小或者从小到大的顺序进行排序
int[] nums ={9,8,7,6,5,4,3,2,1,0};
第一趟比较:8,7,6,5,4,3,2,1,0,9 交换9次 i=0;j=9
第二趟比较:7,6,5,4,3,2,1,0,8,9 交换8次 i=1;j=8
第三趟比较:6,5,4,3,2,1,0,7,8,9 交换7次 i=2;j=7
第四趟比较:5,4,3,2,1,0,6,7,8,9 交换6次 i=3;j=6
第五趟比较:4,3,2,1,0,5,6,7,8,9 交换5次
第六趟比较:3,2,1,0,4,5,6,7,8,9 交换4次
第七趟比较:2,1,0,3,4,5,6,7,8,9 交换3次
第八趟比较:1,0,2,3,4,5,6,7,8,9 交换2次
第九趟比较:0,1,2,3,4,5,6,7,8,9 交换1次
for(int i=0;i<nums.Length-1;i++)
{
for(int j=0;j<nums.Length-1-i;j++)
{
if(nums[j] > nums[j+1])
{
int temp =nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
C#另一个排序升序方法:Array.Sort(nums);
冒泡排序、交换变量不使用第三方变量、求一个字符串中字符出现的次数
11、方法
解决代码冗余问题。函数就是将一堆代码进行重用的一种机制。
函数的语法:
[public] static 返回值类型 方法名([参数列表])
{
方法体;
}
public:访问修饰符,公开的,公共的,那都可以访问。
static:静态的
返回值类型:如果不需要返回值,写void
方法名:Pascal 每个单词的首字母都大写,其余字母小写
参数列表:完成这个方法所必须要提供给这个方法的条件。
方法写好后,如果想要被执行,必须要在Main()函数中调用。
方法的调用语法:
类名.方法名([参数]);
***在某些情况下,类名是可以省略的,如果你写的方法跟Main()函数同在一个类中,这个时候可以省略。
namespace _11_方法 { class Program { static void Main(string[] args) { //计算两个整数的最大值 int max= GetMax(1,2); Console.WriteLine(max); Console.ReadKey(); } /// <summary> /// 计算两个整数的最大值,并将最大值返回 /// </summary> /// <param name="n1">第一个整数</param> /// <param name="n2">第二个整数</param> /// <returns>将最大值返回</returns> public static int GetMax(int n1,int n2) { return n1 > n2 ? n1 : n2; } } }
12、return
(1)、在方法中返回要返回的值。
(2)、立即结束本次方法。
namespace _12_Return { class Program { static void Main(string[] args) { while(true) { Console.WriteLine("Hello World!"); //break; //continue; return; } Console.WriteLine("Hello .Net!"); Console.ReadKey(); } } }