常量
const 变量类型 变量名=值;
常量不能被重新赋值
枚举
[public] enum 枚举名 public:访问修饰符,公开的公共的,哪都能访问
{ enum:声明枚举的关键字
值1, 枚举名:符合Pascal命名规范
值2,
值3,
...
}
枚举就是一个变量类型,就像int,string,double,decimal,是用来存储数据的。只是枚举声明,赋值,使用的方式跟那些普通变量类型不一样。
声明一个枚举:要在命名空间下面,类的上面,表示这一个命名空间的所有类都能用这个枚举
public enum Gender
{
男,
女
}
如何使用呢?和声明变量一样——变量类型 变量名 = 值
Gender gender = Gender.男;
枚举和int或者string类型之间的转换
首先来声明一个枚举:
public enum QQState
{
Online=1,
Offline,
Busy,
QMe
}
将枚举类型转换为int
枚举类型默认跟int类型互相兼容,可以通过强制类型转换互相转换
QQState state = QQState.Busy;
int n = (int)state;
将int转换为枚举
枚举类型默认从0开始,除非赋值。当转换一个枚举中没有的数字的时候,输出的是原数字,不会抛异常。
int n = 3;//如果是8输出的是8
QQState state =(QQState)n;
Console.WriteLine(n);
Console.ReadKey();
现在输出的是Busy
将枚举转换成string
所有类型都可以转换成string类型
QQState state = QQState.Busy;
string s = state.ToString;
Console.WriteLine(s);
Console.ReadKey();
这里直接调用ToString方法转换就行了。
*将string转换成枚举
这个转换就相对复杂一些了,需要输入这样一行代码
枚举名 变量名 = (要转换的类型)Enum.Parse(typeof(要转换的枚举名),"要转换的字符串")
调用Parse()的目的就是为了让它帮助我们将一个字符串转换成对应的枚举类型
typeof用来获取枚举类型
string s = "0";
QQState state = (QQState)Enum.Parse(typeof(QQstare),s);
Console.WriteLine(state);
Console.ReadKey();
如果转换的字符串是数字,就算枚举中没有,也不会抛异常,如果转换的字符串是文本,如果枚举中没有,则抛异常。
枚举练习
//提示用户选择在线状态,接收并将用户输入转换成枚举类型,再打印
Console.WriteLine("选择在线状态 1--Online 2--Offline 3--Busy 4--QMe");
string input = Console.ReadLine();
//用户输入1234,定值比较输出值
switch(input)
{
case "1":QQState s1 = (QQState)Enum.Parse(typeof(QQState),input);
Console.WriteLine("您的选择是{0}",s1);
break;
case "2":QQState s2 = (QQState)Enum.Parse(typeof(QQState),s2);
Console.WriteLine("您的选择是{0}",s2);
break;
case "3":QQState s3 = (QQState)Enum.Parse(typeof(QQState),s3);
Console.WriteLine("您的选择是{0}",s3);
break;
case "4":QQState s4 = (QQState)Enum.Parse(typeof(QQState),s4);
Console.WriteLine("您的选择是{0}".s4);
break;
default:Console.WriteLine("输入数字有误,退出");
break;
}
Console.ReadKey();
结构
[public]struct 结构名
{
成员;//字段
}
变量在程序运行中只能存储一个数据,字段可以存储多个。
public struct Person
{
public string _name;
public int _age;
public Gender _gender;
}
结构练习
//定义一个结构类型Person,有三个成员,分别为姓名,性别,年龄,性别用枚举类型
//声明两个person类型的变量,分别表示张三和小兰
Person.person1;
person1._name = "zs";
person1._age = 21;
person1.gender = Gender.男;
Person.person2;
person2._name = "xl";
person2._age = 19;
person2._gender = Gender.女;
Console.WriteLine(person1._name);
Console.WriteLine(person2._name);
Console.ReadKey();
数组
数组类型[] 数组名=new 数组类型[数组长度]
数组类型[] 数组名={元素1,元素2,元素3...}
数组类型[] 数组名=new 数组类型[3]{元素1,元素2,元素3}
数组类型[] 数组名=new 数组类型[]{元素1,元素2,元素3...}
后面两种声明方式不常用。
数组的长度一旦固定就不能被改变
当写了上面一行代码之后,就在内存中开辟了连续的n块空间,我们管每一块空间称之为这个数组的元素,如果你想要访问数组的某一块元素,就需要通过这个元素的索引(下标)去访问。
数组的第一个元素下标是,0;最后一个元素下标是,数组长度-1
int[] nunms = new int[10];
for (int i = 0; i<nums.Length; i++)//通过一个for循环给每个元素赋值
{
nums[i] = i + 1;
}
for(int i =0;i<nums.Length;i++)//再通过一个for循环打印每一个元素
{
Console.WriteLine(nums[i]);
}
Console.ReadLine();
数组练习
//从一个整数数组中取出最大的整数,最小的整数,总和,平均值
bool b = true;
int sum = 0;//声明一个变量存储总和
int[] number = {12,14,3,2,11,6,7,13,9,10};
for(int i = 0; i < number.Length; i++)//判断最大值
{
for(int j = 1; j < number.Length)//把每一个数和后面的数比大小
{
if(number[i]>number[j])
{
b=true;
}
else
{
b=false;
break;//如果前一个数小于后边的数,就跳出,用下一个数继续去比较
}
}
if(b==true)
{
Console.WriteLine("最大的证书是{0}",number[i])
break;
}
}
for(int i = 0; i < number.Length; i++)//判断最小值
{
for(int j = 1; j < number.Length)//把每一个数和后面的数比大小
{
if(number[i]<=number[j])
{
b=true;
}
else
{
b=false;
break;//如果前一个数大于后边的数,就跳出,用下一个数继续去比较
}
}
if(b==true)
{
Console.WriteLine("最小的证书是{0}",number[i])
break;
}
}
for(int i = 0;i<number.Length;i++)
{
sum+=number[i];
}
Console.WriteLine("总和是{0},平均值是{1}",sum,sum/number.Length);
Console.ReadKey();
//4.将一个整数数组的每一个元素进行如下处理,如果元素是正数,则将这个位置的元素的值+1
//如果是负数,则将这个位置的元素的值-1,如果元素是0,则不变
//for+if else-if
int[] number = {-1,-8,-5,0,7,5,9,0,2,-4}
for(int i =0;i<number.Length;i++)
{
if(number[i]>0)
{
number[i]+=1;
Console.WriteLine(number[i]);
}
else if(number[i]==0)
{
Console.WriteLine(number[i]);
}
else
{
number[i]-=1;
Console.WriteLine(number[i]);
}
Console.ReadKey();
//5.将一个字符串数组的元素的顺序进行反转,{"我","是","好人"}{"好人","是","我"}
//第i个和第length-i-1个交换
string[] word = {"我","是","好人","a"}
for(int i=0;i<word.Length/2;i++)
{
string temp =word[i];
word[i] = word[word.Length-1-i];
word[word.Length-1-i] = temp;
}
for(int i=0;i<word.Length;i++)
{
Console.WriteLine(word[i])
}
Console.ReadKey();
*冒泡排序
将一个数组中的而元素按照从大到小或者从小到大的顺序排列
int[] nums={9,8,7,6,5,4,3,2,1,0}
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 n=nums[j];
nums[j]=nums[j+1];
nums[j+1]=n;
}
}
}
for(int i=0;i<nums.Length.i++)
{
Console.WriteLine(nums[i]);
}
Console.ReadKey();
第一次比较:8,7,6,5,4,3,2,1,0,9
交换了9次
i=0,j=nums.Length-1-i
第二次比较:7,6,5,4,3,2,1,0,8,9
交换了8次
i=1,j=nums.Length-1-i
第三次比较:6,5,4,3,2,1,0,7,8,9
交换了7次
第四次比较:5,4,3,2,1,0,6,7,8,9,
交换了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次
但是实际上每一次都是比较了九次,修改代码如下
int[] nums={9,8,7,6,5,4,3,2,1,0}
for(int i=0;i<nums.Length-1;i++)
{
for(int j=0;j<nums.Length-1;j++)
{
if(nums[j]>nums[j+1])
{
int n=nums[j];
nums[j]=nums[j+1];
nums[j+1]=n;
}
}
}
for(int i=0;i<nums.Length.i++)
{
Console.WriteLine(nums[i]);
}
Console.ReadKey();
Array.Sort(nums);//只能针对数组做一个升序排列
Array.Reverse(nums);//对数组进行反转
方法/函数
[public] static 返回值类型 方法名([参数列表])
{
方法体;
}
public:访问修饰符
static关键字:静态的
返回值类型:返回的值是什么类型,返回值类型就写什么
方法名:Pascal——要求每个单词的首字母都要大写,其余首字母小写
参数列表:要完成这个方法所必须提供给这个方法的条件,如果没有条件,()不能省略
方法就是将一堆代码进行重用的一种机制。方法就是一段代码,可能有输入的值(参数),可能有返回值。一个方法就像专门做这件事的人,我们调用它完成某件事的时候,它需要我们提供一些数据(参数),它执行完之后会给我们一个返回值。
方法写好后,想要被执行,必须要在Main()函数中调用,调用方法如下
类名.方法名([参数]);
如果你写的方法和Main()函数在同一个类中,类名可以省略。
/// <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;//ruturn作用1:在方法中返回要返回的值,
//2.立即结束本次方法
}