




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章VisualC#案例基础:C#语言基础2.1一个简单例子(控制台方式):计算圆面积2.2数据类型2.3常量和变量2.4运算符和表达式2.5流程控制2.6数组、结构和枚举知识点链接L2.1VS2008开发环境介绍自从微软2000年提出NET战略后,.NETFramework版本不断升级,2008年随着微软的.NETFramework3.5版本的发布,同时也意味着.NET技术越来越成熟,作为.NET开发的首选语言C#语言也越来越受人们的青睐,C#的优点也同时被人们所认同。与此同时微软也发布了VisualStudio2008开发环境(以下简称VS2008)。2.1一个简单例子(控制台方式):计算圆面积【例EX2_1】设计计算圆面积的控制台应用程序。实现步骤:1.新建控制台项目运行VS2008,执行【文件】→【新建】→【项目】菜单命令,弹出“新建项目”对话框,选择VisualC#的Windows项目类型,选择控制台应用程序模板,项目命名为“EX2_1”,如图2.1所示。图2.1新建控制台应用程序项目图2.1新建控制台应用程序项目2.1一个简单例子(控制台方式):计算圆面积2.添加代码单击“确定”按钮后,系统新建了一个命名为“EX2_1”的控制台项目,并打开Program.cs文件。添加代码,代码如下所示。usingSystem;引用的命名空间usingSystem.Collections.Generic;
usingSystem.Linq;usingSystem.Text;namespaceEX2_1 //定义的命名空间{classProgram //定义类Program{staticvoidMain(string[]args) //程序的入口点{Console.WriteLine("请输入圆的半径"); //输出“请输入圆的半径”提示字样stringr=Console.ReadLine(); //读入所输入的字符doubleIntR=Convert.ToDouble(r); //将字符类型转换为数值类型constdoublePI=3.1415926; //定义圆周率Console.WriteLine(PI*IntR*IntR); //计算圆面积并输出}}}引用的命名空间2.1一个简单例子(控制台方式):计算圆面积3.运行程序,计算圆的面积按【Ctrl+F5】快捷键运行程序,输入半径值“36”,结果如图2.2所示。图2.2盘计算圆的面积2.1一个简单例子(控制台方式):计算圆面积说明:(1)命名空间是提供了一种组织相关类和其他类型的方式,当引用了命名空间时,即可直接调用其中的类。例如,System是一个命名空间,Console是该命名空间中的类。在后面章节中将详细介绍。(2)Console类属于System命名空间,表示控制台应用程序的标准输入、输出流和错误流。提供用于从控制台读取单个字符或整行的方法,还提供若干写入方法,可将值类型的实例、字符数组以及对象集自动转换为格式化或未格式化的字符串,然后将该字符串(可选择是否尾随一个行终止字符串)写入控制台。(3)static关键字是对方法的修饰,其含义在后续章节中将详细介绍。(4)在代码中“//”为代码注释符号,也可以使用“/*所要注释内容*/”加以注释。如:namespaceEX2_1 /*定义的命名空间*/2.1一个简单例子(控制台方式):计算圆面积(5)调试运行程序有两种方式,分别如下:①
执行【调试】→【开始执行(不调试)】菜单命令,或者直接按【Ctrl+F5】快捷键运行程序。这种方式只执行程序并不调试程序。②
执行【调试】→【启动调试】菜单命令,或者直接按【F5】快捷键调试程序。这种方式需要设置断点,当程序执行到断点时按【F10】快捷键逐步调试程序,也可以单击工具栏中的“
”按钮启动调试。2.1一个简单例子(控制台方式):计算圆面积在【例EX2_1】中设置断点逐步调试程序。调试步骤如下:①
单击语句“Console.WriteLine("请输入圆的半径");”的左端设置断点,如图2.3所示。②
按【F5】快捷键调试程序,程序执行到断点处停止执行,如图2.4所示。③
按【F10】快捷键逐步调试程序,当弹出控制台窗口提示输入圆的半径时输入半径“5”,按回车键继续运行程序,同时在“自动窗口”中显示各个变量的值,最终将计算的结果显示在控制台窗口中。
图2.3设置断点
图2.4程序运行到断点处2.2数据类型C#包括两种变量类型:值类型和引用类型,数据类型的分类如图2.5所示。本节简单介绍这两种数据类型以及装箱与拆箱的基本概念。图2.5数据类型的分类2.2.1值类型所谓值类型就是一个包含实际数据的量。当定义一个值类型的变量时,C#会根据它所声明的类型,以堆栈方式分配一块大小相适应的存储区域给这个变量,随后对这个变量的读、写操作就直接在这块内存区域进行。例如:intiNum=10; //分配一个32位内存区域给变量iNum,并将10放入该内存区域iNum=iNum+10; //从变量iNum中取出值,加上10,再将计算结果赋给iNum如图2.6所示为这个值类型的操作示意图。图2.6值类型操作示意图2.2.1值类型简单类型是系统预置的,一共有13个数值类型,如表2.1所示。2.2.2引用类型引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。例如:stringS1,S2;S1="ABCD";S2=S1;其中,S1、S2是指向字符串的引用变量,S1的值是字符串''ABCD''存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得S2、S1都是对''ABCD''的引用,如图2.7所示。图2.7引用类型赋值示意2.2.2引用类型引用类型包括class(类)、interface(接口)、数组、delegate(委托)、object和string。其中object和string是两个比较特殊的类型。C#的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从object继承的。可以将任何类型的值赋给object类型的变量。例如:inta=10;objectabj=a; //将int类型a赋给了object类型abjstring类型表示Unicode字符的字符串。string是.NETFramework中System.String的别名。尽管string是引用类型,但定义相等运算符是为了比较string对象(而不是引用)的值。这使得对字符串相等性的测试更为直观。例如:stringmyString1="中国"; //把字符串“中国”赋给字符型变量myString1stringmyString2="中国"; //把字符串“中国”赋给字符型变量myString2Console.WriteLine(myString1==myString2); //相等,显示True2.2.2引用类型字符串可以使用两种形式表达,即直接使用双引导括起来或者在双引号前加上@。通常情况下,会直接使用双引号来表示字符串,例如:stringmyString="sample"。
//正确但是,当字符串中包含某些特殊转义符时,@将非常有用。请看下面出现错误的例子:stringmyString="C:\Windows"; //错误因为"\"被认为是转义符的开始,而"\W"却不是系统内置的转义符,因此编译出错。下面是正确的两个例子:stringmyString="C:\\Windows"; //正确,“\\”转义为“\”stringmyString=@"C:\Windows"; //正确对于使用“@”开始的字符串标识,编译器将忽略其中的转义符,而将其直接作为字符处理。2.2.3装箱和拆箱装箱是值类型转换为object类型,或者转换为由值类型所实现的任何接口类型。把一个值类型的值装箱,也就是创建一个对象并把这个值赋给这个对象。以下是一个装箱的代码,图2.8给出了装箱操作示意图。inti=123; //把“123”赋给int型变量iobjecto=i; //装箱操作拆箱操作正好相反,是从object类型转换为值类型,或者是将一个接口类型转换为一个实现该接口的值类型。图2.8装箱操作2.2.3装箱和拆箱拆箱的过程分为2个步骤:一是检查对象实例是否是给定的值类型的装箱值,二是将值从对象实例中复制出来。下面列出一个简单的拆箱操作代码,图2.9给出了拆箱操作示意图。inti=123; //把“123”赋给int型变量iobjecto=i; //装箱操作intj=(int)o; //拆箱操作图2.9拆箱操作2.2.3装箱和拆箱【例EX2_2】string引用类型的特殊性。实现步骤:1.新建一个控制台项目项目命名为“EX2_2”。2.添加代码代码如下所示。3.运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.10所示。图2.10例EX2_2运行结果2.3常量和变量2.3.1常量常量,顾名思义就是在程序运行期间其值不会改变的量。常量及其使用非常直观,以能读懂的固定格式表示固定的数值,每一种值类型都有自己的常量表示形式。例如:168U //这是一个uint类型常量32L //这是一个long类型常量常量通常可以分为以下几种。2.3.1常量1.整型常量对于一个整数值,默认的类型就是能保存它的最小整数类型,其类型可以分为int、uint、long或ulong。如果默认类型不是想要的类型,可以在常量后面加后缀(U或L)来明确指定其类型。在常量后面加L或l(不区分大小写)表示长整型。例如:32 //这是一个int类型32L //这是一个long类型在常量后面加U或u(不区分大小写)表示无符号整数。例如:128U //这是一个uint类型128UL //这是一个ulong类型整型常量既可以采用十进制也可以采用十六进制,不加特别说明默认为十进制,在数值前面加0x(或0X)则表示十六进制数,十六进制基数用0~9、A~F(或a~f)表示,例如:0x20 //十六进制数20,相当于十进制数320x1F //十六进制数1F,相当于十进制数312.3.1常量2.浮点常量一般带小数点的数或用科学计数法表示的数都被认为是浮点数,它的数据类型默认为double类型,但也可以加后缀符表明三种不同的浮点格式数。(1)在数字后面加F(f)表示float类型。(2)在数字后面加D(d)表示double类型。(3)在数字后面加M(m)表示decimal类型。例如:3.14,3.14e2,0.168E2//都是double类型常量,3.14e2相当于3.14×1020.168E2相当于0.618×1023.14F,0.168f //都是float类型常量3.14D,0.168d //都是double类型常量3.14M,0.168m //都是decimal类型常量2.3.1常量3.字符常量字符常量,简单地说,就是用单引号括起来的单个字符,如'A',它占16位,以无符号整型数的形式存储这个字符所对应的Unicode代码。这对于大多数图形字符是可行的,但对一些非图形的控制字符(如回车符)则行不通,所以字符常量的表达有若干种形式。(1)单引号括起的一个字符,如'A'。(2)十六进制的换码系列,以“\x”或“\X”开始,后面跟4位十六进制数,如'\X0041'。(3)Unicode码表示形式,以“\U”或“\u”开始,后面跟4位十六进制数,如'\U0041'。(4)显式转换整数字符代码,如(char)65。(5)字符转义系列,如表2.2所示。2.3.1常量4.字符串常量字符串常量是用双引号括起的零个或多个字符序列。C#支持两种形式的字符串常量,一种是常规字符串,另一种是逐字字符串。(1)常规字符串。双引号括起的一串字符,可以包括转义字符。例如:"Hello,World\n" //表示字符串Hello,World加换行符"C:\\windows\\Microsoft" //表示字符串
C:\windows\Microsoft(2)逐字字符串。在常规的字符串前面加一个@,就形成了逐字字符串,它的意思是字符串中的每个字符均表示本意,不使用转义字符。如果在字符串中需用到双引号,则可连写两个双引号来表示一个双引号。例如:@"C:\windows\Microsoft" //与
"C:\\windows\\Microsoft"含义相同@"Hesaid""Hello""tome" //与"Hesaid\"Hello\"tome"含义相同2.3.1常量5.布尔常量它只有两个值:true和false。6.符号常量在声明语句中,可以声明一个标识符常量,但必须在定义标识符时就进行初始化,并且定义之后就不能再改变该常量的值。具体的格式为:const类型
标识符=初值例如:constdoublePI=3.14159 //标识符PI就是3.141592.3.2变量C#中的变量必须先声明后使用。声明变量包括变量的名称、数据类型,必要时指定变量的初始值。声明变量的形式:类型
标识符;或
类型
标识符[=初值][,…];标识符必须以字母或者_(下画线)开头,后面跟字母、数字和下画线的组合。例如:name、_Int、Name、x_1 //都是合法的标识符但C#是大小写敏感的语言,name、Name分别代表不同的标识符,在定义和使用时要特别注意。另外变量名不能与C#中的关键字相同,除非标识符是以@作为前缀的。例如:intx; //合法floaty1=0.0,y2=1.0,y3; //合法,变量说明的同时可以设置初始数值stringchar //不合法,因为char是关键字string@char //合法2.3.2变量【例EX2_3】string引用类型的特殊性。实现步骤:1.新建一个控制台项目项目命名为“EX2_3”。2.添加代码代码如下所示。3.运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.11所示。图2.11例EX2_3运行的结果2.4运算符和表达式表达式是由操作数和运算符构成的。操作数可以是常量、变量、属性等;运算符指示对操作数进行什么样的运算。因此,也可以说表达式就是利用运算符来执行某些计算并且产生计算结果的语句。例如:inta=3,b=5,c;c=a+b; //赋值表达式语句,结果是c等于8C#提供大量的运算符,按需要操作数的数目来分,有一元运算符(如++)、二元运算符(如+,*)、三元运算符(如?:)。按运算功能来分,基本的运算符可以分为以下几类:(1)算术运算符。(2)关系运算符。(3)逻辑运算符。(4)赋值运算符。(5)条件运算符。(6)位运算符。(7)其他(分量运算符'.',下标运算符
'[]'等)。2.4.1算术运算符算术运算符作用的操作数类型可以是整型也可以是浮点型,运算符如表2.3所示。其中:(1)“+*/”运算与一般代数意义及其他语言相同,但需要注意:当“/”作用的两个操作数都是整型数据类型时,其计算结果也是整型。例如:4/2 //结果等于25/2 //结果等于25/2.0 //结果等于2.5(2)“%”取模运算,即获得整数除法运算的余数,所以也称取余。例如:11%3 //结果等于212%3 //结果等于011.0%3 //结果等于2,这与C/C++不同,它也可作用于浮点类型的操作数2.4.1算术运算符(3)“++”和“”递增和递减运算符是一元运算符,它作用的操作数必须是变量,不能是常量或表达式。它既可出现在操作数之前(前缀运算),也可出现在操作数之后(后缀运算),前缀和后缀有共同之处,也有很大区别。例如:++x //先将x加一个单位,然后再将计算结果作为表达式的值x++ //先将x的值作为表达式的值,然后再将x加一个单位不管是前缀还是后缀,它们操作的结果对操作数而言,都是一样的,操作数都加了一个单位,但它们出现在表达式运算中是有区别的。例如:intx,y;x=5;y=++x; //x和y的值都等于6x=5;y=x++; //x的值是6,y的值是52.4.2关系运算符关系运算符用来比较两个操作数的值,运算结果为布尔类型的值(true或false),如表2.4所示。2.4.2关系运算符如果操作数是string类型的,则在下列两种情况下被视为两个string值相等。(1)两个值均为null。(2)两个值都是对字符串实例的非空引用,这两个字符串不仅长度相同,并且每一个对应的字符位置上的字符也相同。例如:
intx=1,y=1;objectb1,b2,b3;strings1="ABCD",s2="1234",s3="ABCD";b1=x;b2=b1;b3=y;x==y; //结果为trueb1==b2; //结果为trueb1!=b3; //结果为trues1==s2; //结果为falses1==s3; //结果为true关系比较运算“>、>=、<、<=”是以顺序作为比较的标准,所以它要求操作数的数据类型只能是数值类型,即整型数、浮点数、字符及枚举等类型。2.4.3逻辑运算符逻辑运算符是用来对两个布尔类型的操作数进行逻辑运算的,运算的结果也是布尔类型,如表2.5所示。假设p、q是两个布尔类型的操作数,表2.6给出了逻辑运算的真值表。2.4.3逻辑运算符运算符“&&”和“||”的操作结果与“&”和“|”一样,但它们的短路特征使代码的效率更高。所谓短路就是在逻辑运算的过程中,如果计算第一个操作数时,就能得知运算结果就不会再计算第二个操作数,例如:intx,y;boolz;x=1;y=0;z=(x>1)&(++y>0); //z的值为false,y的值为1z=(x>1)&&(++y>0); //z的值为false,y的值为02.4.4赋值运算符1.简单赋值运算符语法形式:var=exp赋值运算符左边的称为左值,右边的称为右值。右值是一个与左值类型兼容的表达式(exp),它可以是常量、变量或一般表达式。左值必须是一个已定义的变量或对象(var),因为赋值运算就是将表达式的值存放到左值,因此左值必须是内存中已分配的实际物理空间。例如:inta=1;intb=++a; //a的值加1赋给了b如果左值和右值的类型不一致,在兼容的情况下,则需要进行自动转换(隐式转换)或强制类型转换(显式类型转换)。一般原则是,从占用内存较少的短数据类型向占用内存较多的长数据类型赋值时,可以不做显式的类型转换,C#会进行自动类型转换,反之当从较长的数据类型向占用较少内存的短数据类型赋值时,则必须做强制类型转换。例如:inta=2000;doubleb=a; //隐式转换,b等于2000bytec=(byte)a; //显式转换,c等于2082.4.4赋值运算符2.复合赋值运算符在进行如x=x+3运算时,C#提供一种简化方式x+=3,这就是复合赋值运算。语法形式:varop=exp//op表示某一运算符等价于var=varopexp除了关系运算符,一般二元运算符都可以和赋值运算符在一起构成复合赋值运算,如表2.7所示。2.4.5条件运算符语法形式:exp1?exp2:exp3其中,表达式exp1的运算结果必须是一个布尔类型值,表达式exp2和exp3可以是任意数据类型,但它们返回的数据类型必须一致。首先计算exp1的值,如果其值为true,则计算exp2值,这个值就是整个表达式的结果;否则,取exp3的值作为整个表达式的结果。例如:z=x>y?x:y; //z的值就是x,y中较大的一个值
z=x>=0?x:x; //z的值就是x的绝对值条件运算符“?:”是C#中唯一的一个三元运算符。2.4.6运算符的优先级与结合性在表达式中,运算符的优先级和结合性控制着运算的执行顺序,也可以用圆括号“()”显式地标明运算顺序,例如:(x+y)*2 //x加上y后再乘以2表2.8列出了C#运算符的优先级与结合性,其中表顶部的优先级较高。2.4.6运算符的优先级与结合性【例EX2_4】一元前缀递减和一元后缀递减的区别。实现步骤:1.新建一个控制台项目项目命名为“EX2_4”。2.添加代码代码如下所示。3.运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.12所示。图2.12例EX2_4运行的结果2.5流程控制2.5.1条件语句1.if语句if语句在使用时可以有几种典型的形式,它们分别是:if框架、if_else框架、if_elseif框架及嵌套的if语句,下面逐一介绍。(1)if框架语法形式:if(条件表达式)语句;如果条件为真,则执行语句。在语法上这里的语句是指单个语句,若想执行一组语句,可将这一组语句用“{”和“}”括起来构成一个块语句,当然在语法上块语句就是一条语句,下面涉及的语句都是这个概念。例如:if(x<0)x=x; //取x的绝对值if(a+b>c&&b+c>a&&a+c>b) //判断数据合法性{ p=(a+b+c)/2; s=Math.Sqrt(p*(pa)*(pb)*(pc)); //求三角形面积}2.5.1条件语句(2)if_else框架语法格式:if(条件表达式)
语句1;else
语句2;如果条件表达式为真,执行语句1;否则,执行语句2。例如:if(a+b>c&&b+c>a&&a+c>b) //判断数据合法性{ p=(a+b+c)/2; s=Math.Sqrt(p*(pa)*(pb)*(pc)); //求三角形面积}else Console.WriteLine("三角形的三条边数据有错!"); //输出出错信息2.5.1条件语句(3)if_elseif框架语法形式:if(条件表达式1)
语句1;elseif(条件表达式2)
语句2;elseif(条件表达式3)
语句3; …[else
语句n
;]2.5.1条件语句该语句执行时,从上往下计算相应的条件表达式,如果结果为真则执行相应语句,跳过if_elseif框架的剩余部分,直接执行if_elseif框架的下一条语句;如果结果为假,则继续往下计算相应的条件表达式,直到所有的条件表达式都不成立,则执行这个语句的最后部分else所对应的语句,或者如果没有else语句就什么也不做。例如:
if(studentGrade>=90) Console.WriteLine("成绩优秀");elseif(studentGrade>=80) Console.WriteLine("成绩良好");elseif(studentGrade>=60) Console.WriteLine("成绩及格"); else Console.WriteLine("成绩不及格");2.5.1条件语句(4)嵌套的if语句在if语句框架中,无论条件表达式为真或为假,将要执行的语句都有可能又是一个if语句,这种if语句又包含if语句的结构就称为嵌套的if语句。为了避免二义性,C#规定else语句与和它处于同一模块最近的if相匹配。例如:假设有一函数2.5.1条件语句下面是用嵌套的if语句缩写的程序片断。inty=0,x;if(x>=0) if(x>0) y=1; else y=1;这个else是与最近的if匹配,那么else的含义就是x=0的情况,所以这个程序逻辑上是错的。如果按这个结构写,应修正为:inty=0,x;if(x>=0){ if(x>0) y=1;}else y=1;通过对嵌套的if语句加“{}”,把离else最近的if语句屏蔽了,这样else就与if(x>=0)匹配,从而正确地完成了这个函数的功能。2.5.1条件语句2.switch语句switch语句是一个多分支结构的语句,它所实现的功能与if_elseif结构很相似,但在大多数情况下,switch语句表达方式更直观、简单、有效。语法格式:switch(表达式){ case常量1:
语句序列1; //由零个或多个语句组成 Break; case常量2:
语句序列2; Break; … default://default是任选项,可以不出现
语句序列n; Break;}2.5.1条件语句C#的switch语句需要注意以下几点:(1)switch语句的表达式必须是整数类型,如char、sbyte、byte、ushort、short、uint、int、ulong、long或string、枚举类型,case常量必须是与表达式类型相兼容,case常量的值必须互异,不能有重复。(2)将与某个case相关联的语句序列接在另一个case语句序列之后是错误的,这称为“不穿透”规则,所以需要跳转语句结束这个语句序列,通常选用break语句作为跳转,也可以用goto转向语句等。“不穿透”规则是C#对C、C++、Jave这类语言中的switch语句的一个修正,这样做的好处是:一是允许编译器对switch语句做优化处理时可自由地调整case的顺序;二是防止程序员不经意地漏掉break语句而引起错误。(3)虽然不能让一个case的语句序列穿透到另一个case语句序列,但是可以有两个或多个case前缀指向相同的语句序列。2.5.1条件语句【例EX2_5】利用“switch”语句把百分制学生成绩换算成等级制成绩。实现步骤:(1)新建一个控制台项目项目命名为“EX2_5”。(2)添加代码代码如下所示。(3)运行程序按【Ctrl+F5】快捷键运行程序,输入成绩“86”并按回车键,结果如图2.13所示。图2.13例EX2_5运行的结果2.5.2循环语句1.while语句语法形式:
while(条件表达式)
循环体语句;如果条件表达式为真(true),则执行循环体语句。while语句执行流程如图2.14所示。图2.14while语句执行流程图2.5.2循环语句例如,求0~100的整数和:intSum,i;Sum=0;i=1;while(i<=100){ Sum+=i; i++;}Console.WriteLine("Sumis"+Sum); //输出结果是:Sumis50502.5.2循环语句2.do_while语句语法格式:do{
循环体语句;}while(条件表达式);
该循环首先执行循环体语句,再判断条件表达式。如果条件表达式为真(true),则继续执行循环体语句。do…while循环语句执行流程如图2.15所示。图2.15do_while语句执行流程图2.5.2循环语句while语句与do_while语句很相似,它们的区别在于while语句的循环体有可能一次也不执行,而do_while语句的循环体至少执行一次。例如使用do_while方法求0~100的整数和:intSum=0,i=1; do { Sum+=i; i++; }while(i<=100);Console.WriteLine("Sumis"+Sum); //输出结果是:Sumis50502.5.2循环语句3.for语句C#的for循环是循环语句中最具特色的,它功能较强,灵活多变,使用广泛。语法形式:for(表达式1;表达式2;表达式3)
循环体语句;for语句执行流程如图2.16所示。一般情况下,表达式1是设置循环控制变量的初值;表达式2是布尔类型的表达式,作为循环控制条件;表达式3是设置循环控制变量的增值(正负皆可)。图2.16for语句执行流程图2.5.2循环语句3个表达式都是可选的,默认某个表达式时,其后的分号“;”不能省,如3个表达式都默认的情况如下:for(;;){语句}for语句的执行顺序如下:(1)按书写顺序将表达式1执行一遍,为循环控制变量赋初值;(2)测试表达式2是否为真;(3)若没有表达式2或表达式2为真,则执行内嵌语句一遍,按表达式3的规律改变循环控制变量的值,回到第二步执行;(4)若表达式2不满足,则for循环终止。2.5.2循环语句for循环的一些变化特点:(1)for循环语句,表达式1和表达式3可引入逗号运算符“,”,这样可以对若干变量赋初值或增值。例如:intSum,i;for(Sum=0,i=1;i<=100;i++) Sum+=i;Console.WriteLine("Sumis"+Sum); //在页面上输出结果是:Sumis5050for(Sum=0,i=1;i<=100;Sum+=i,i++); //循环体是一个空语句Console.WriteLine("Sumis"+Sum); //在页面上输出结果是:Sumis50502.5.2循环语句(2)for循环的3个表达式可以任意默认,甚至全部默认,如果表达式2默认就约定它的值是true。但不管哪个表达式默认,其相应的分号“;”不能默认。例如:intSum,i;for(Sum=0,i=1;i<=100;) //默认表达式3 Sum+=i++;Console.WriteLine("Sumis"+Sum);//输出结果是:Sumis5050for(Sum=0,i=1;;Sum+=i,i++) //默认表达式2,约定值是true if(i>100)break; //但条件满足时,break语句跳出循环Console.WriteLine("Sumis"+Sum);Sum=0;i=1;for(;;) //3个表达式都默认{ Sum+=i++; if(i>100) //这种情况一般都会用if语句来设置跳出循环 break;}Console.WriteLine("Sumis"+Sum); //输出结果是:Sumis50502.5.2循环语句(3)可在for循环内部声明循环控制变量。如果循环控制变量仅仅只在这个循环中用到,那么为了更有效地使用变量,也可在for循环的初始化部分(表达式1)声明该变量,当然这个变量的作用域在这个循环内。例如:intSum=0;for(inti=1;i<=100;i++) //i只在这个for循环中有效 Sum+=i;Console.WriteLine("i="+i); //编译出错,i这时已经无效Console.WriteLine("Sumis"+Sum); //在页面上输出结果是:Sumis50502.5.2循环语句【例EX2_6】利用for语句计算百元百鸡问题。所谓百元百鸡问题就是说公鸡5元一只、母鸡3元一只、小鸡1元3只,问100元买100只鸡,其中,公鸡、母鸡、小鸡各多少只。设计思路:设公鸡数、母鸡数、小鸡数分别为gj、mj、xj,则要满足如下两个条件:gj+mj+xj=1005*gj+3*mj+xj/3=100实现步骤:(1)新建一个控制台项目项目命名为“EX2_6”。(2)添加代码代码如下所示。2.5.2循环语句(3)运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.17所示。说明:Console的Write与WriteLine方法可以显示格式化数据。此例WriteLine方法中“{0}、{1}、{2}”是格式项,其字符序列告诉这个方法使用哪个变元,如何格式化。例如此例中“{0}”使用gj变元,“{1}”使用mj变元,“{2}”使用xj变元。图2.17例EX2_6运行的结果2.5.2循环语句4.foreach语句foreach语句是C#中新引入的,它表示收集一个集合中的各元素,并针对各元素执行内嵌语句。语法格式:foreach(类型
标识符
in集合表达式
)语句;其中:(1)标识符是指foreach循环的迭代变量,它只在foreach语句中有效,并且是一个只读局部变量,也就是说在foreach语句中不能改写这个迭代变量。它的类型应与集合的基本类型相一致。(2)集合表达式是指被遍历的集合,例如数组。在foreach语句执行期间,迭代变量按集合元素的顺序依次将其内容写入。例如:intm=0;stringmystring="laskdjflasdkjasdalfakeoflkdsa";foreach(charmycharinmystring){ if(mychar=='a') //判断迭代变量mychar是否为a字符 m++;}Console.WriteLine("字符串中有{0}个a",m); //输出“字符串中有6个a”2.5.3跳转语句1.continue语句语法形式:continue;continue语句只能用于循环语句中,它的作用是结束本轮循环,不再执行余下的循环体语句,对while和do_while结构的循环,在continue执行之后,就立刻测试循环条件,以决定循环是否继续下去;对for结构循环,在continue执行之后,先求表达式3(即循环增量部分),然后再测试循环条件。通常它会和一个条件语句结合起来使用,不会是独立的一条语句,也不会是循环体的最后一条语句,否则没有任何意义。例如:for(intn=1;n<=100;n++){ if(n%3!=0)continue; //如果n不能被3整除,则直接进入下一轮循环 Console.WriteLine(n+""); //只有能被3整除的数,才会执行到此,显示出来}此段代码是输出1~100含有因子3的数。2.5.3跳转语句2.break语句语法形式:break;break语句只能用于循环语句或switch语句中。如果在switch语句中执行到break语句,则立刻从switch语句中跳出,转到switch语句的下一条语句;如果在循环语句执行到break语句,则会导致循环立刻结束,跳转到循环语句的下一条语句。不管循环有多少层,break语句只能从包含它的最内层循环跳出一层。例如:intm=0;stringmystring="laskdjflasdkjasdalfakeoflkdsa";foreach(charmycharinmystring){ m++; if(mychar=='a') //判断迭代变量mychar是否为a字符break; //mychar为a字符则跳出循环}Console.WriteLine("字符串中第1个a在"+m+"位置");//输出:字符串中第1个a在2位置此段代码是查找出字符串中第1个a所在的位置。2.5.3跳转语句3.return语句语法形式:return;或return表达式;return语句出现在一个方法内。在方法中执行到return语句时,程序的执行流程转到调用这个方法处。如果方法没有返回值(返回类型修饰为void),则使用“return”格式返回;如果方法有返回值,那么使用“return表达式”格式,其后面跟的表达式就是方法的返回值。例如:protectedvoidPage_Load(objectsender,EventArgse){ return; //返回 Console.WriteLine("程序执行到此"); //并不显示“程序执行到此”字样}2.5.3跳转语句4.goto语句goto语句可以将程序的执行流程从一个地方转移到另一个地方,非常灵活,但正因为它太灵活,所以容易造成程序结构混乱的局面,应该有节制地、合理地使用goto语句。语法形式:goto标号;标号:语句;其中,“标号”就是定位在某一语句之前的一个标识符,称为标号语句。例如:intm=0;stringmystring="laskdjflasdkjasdalfakeoflkdsa";foreach(charmycharinmystring){ m++; if(mychar=='a') //判断迭代变量mychar是否为a字符gotoend; //mychar为a字符则跳出循环}end:Console.WriteLine("第1个a在第"+m+"位"); //输出:第1个a在第2位2.5.3跳转语句它给出goto语句转向的目标,在页面上输出“第1个a在第2位”字样,值得注意的是,goto语句不能使控制转移到另一个语句块内部,更不能转到另一个函数内部。另外,goto语句如果用在switch语句中,有如下形式。语法形式:gotocase常量;gotodefault;它只能在本switch语句中从一种情况转向另一种情况。例如。2.5.4异常处理程序中对异常的处理能使程序更加健壮。现在的许多程序设计语言都增加了异常处理的能力,C#也不例外。异常产生的原因主要有2点:(1)由throw语句立即无条件的引发异常,控制永远不会到达紧跟在throw语句后的语句。(2)在处理C#语句和表达式的过程中,会出现一些例外情况,使某些操作无法正常完成,此时就会引发一个异常。例如,整数除法运算中,如果分母为零,就会引发一个DivideByZeroException异常。异常处理语法形式:try{
语句}catch(类型标识符){
语句}finally{语句
}2.5.4异常处理如果执行try块出现异常则转向相应的catch块,执行完catch块后再执行finally块。finally块总是在离开try语句块后执行的,而且finally块中程序是必须执行的,finally块主要是释放资源。例如:inta=5,b=0;try{ a/=b; //不能除以零,所以导致异常}catch(DivideByZeroExceptionde){ Console.WriteLine(de.Message); //输出“试图除以零” return; //返回}finally{ Console.WriteLine("执行到finally块中");}//输出“执行到finally块中”2.5.4异常处理【例EX2_7】利用checked语句关键字检查算术运算是否有溢出。实现步骤:1.新建一个控制台项目项目命名为“EX2_7”。2.添加代码代码如下所示。3.运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.18所示。图2.18例EX2_7运行的结果2.6数组、结构和枚举2.6.1数组1.一维数组一维数组是以线性方式存储固定数目的项的数组。(1)一维数组的声明语法形式:type[]arrayName;其中:type是可以是C#中任意的数据类型。[]是表明后面的变量是一个数组类型,必须放在数组名之前。arrayName是数组名,遵循标识符的命名规则。例如:
int[]a1; //a1是一个含有int类型数据的数组double[]f1; //f1是一个含有double类型数据的数组
string[]s1; //s1是一个含有string类型数据的数组2.6.1数组(2)创建数组对象用new运算符创建数组实例,有两种基本形式。声明数组和创建数组分别进行。语法形式:type[]arrayName; //数组声明arrayName=newtype[size]; //创建数组实例size是表明数组元素的个数。声明数组和创建数组实例也可以合在一起写:type[]arrayName=newtype[size];例如:int[]a1;a1=newint[10]; //a1是一个有10个int类型元素的数组string[]s1=newstring[5]; //s1是含有5个string类型元素的数组2.6.1数组(3)一维数组的初始化语法形式1:type[]arrayName=newtype[size]{val1,val2,…,valn};数组声明与初始化同时进行时,size就是数组元素的个数,它必须是常量,而且应该与大括号内的数据个数一致。语法形式2:type[]arrayName=newtype[]{val1,val2,…,valn};默认size,由编译系统根据初始化表中的数据个数,自动计算数组的大小。语法形式3:type[]arrayName={val1,val2,…,valn};数组声明与初始化同时进行,还可以默认new运算符。语法形式4:type[]arrayName;arrayName=newtype[size]{val1,val2,…,valn};2.6.1数组把声明与初始化分开在不同的语句中进行时,size同样可以默认,也可以是一个变量。例如:int[]nums=newint[10]{0,1,2,3,4,5,6,7,8,9}; //使用语法形式1初始化int[]nums=newint[]{0,1,2,3,4,5,6,7,8,9}; //使用语法形式2初始化int[]nums={0,1,2,3,4,5,6,7,8,9}; //使用语法形式3初始化int[]nums;nums=newint[10]{0,1,2,3,4,5,6,7,8,9}; //使用语法形式4初始化2.6.1数组(4)一维数组的访问数组具有初值时,就可以像其他变量一样被访问,既可以取数组元素的值,又可以修改数组元素的值。在C#中是通过数组名和数组元素的下标来引用数组元素的。语法形式:
数组名[下标]下标是数组元素的索引值,实际上就是要访问的那个数组元素在内存中的相对位移。注意:相对位移是从0开始的,所以下标的值从0到数组元素的个数1为止。例如:intmax,min;int[]queue=newint[10]{89,78,65,52,90,92,73,85,91,95};//定义一个一维数组max=min=queue[0]; //queue[0]是数组第一个数for(inti=1;i<10;i++){ if(queue[i]>max)max=queue[i]; if(queue[i]<min)min=queue[i];}Console.WriteLine("最大数是:"+max+"<br>最小数是:"+min);//输出数组中的最大值和最小值2.6.1数组2.多维数组多维数组就是指能用多个下标访问的数组,多维数组类似于同类型值的矩阵。(1)多维数组的声明语法形式:type[,,,]arrayName;在声明时方括号内加逗号,就表明是多维数组,有n个逗号,就是n+1维数组。例如:
int[,]score; //score是一个int类型的二维数组float[,,]table; //table是一个float类型的三维数组2.6.1数组(2)创建数组对象声明数组和创建数组分别进行。语法形式:type[,,,]arrayName; //数组声明arrayName=newtype[size1,size2,size3]; //创建数组实例size1,size2,size3分别表明多维数组每一维的元素个数。声明数组和创建数组实例也可以合在一起写。语法形式:type[,,,]arrayName=newtype[size1,size2,size3];例如:int[,]score;score=newint[3,4]; //score是一个3行4列的二维数组float[,,]table=newfloat[2,3,4] //table是一个三维数组,每一维的维数分别是2、3、42.6.1数组(3)多维数组的初始化多维数组初始化是将每维数组元素设置的初始值放在各自的大花括号内,下面以最常用的二维数组为例来讨论。语法形式1:type[,]arrayName=newtype[size1,size2]{{val11,val12,…,val1n},{val21,val22,…,val2n},…,{valm1,valm2,…,valmn}};数组声明与初始化同时进行,数组元素的个数是size1*size2,数组的每一行分别用一个花括号括起来,每个花括号内的数据就是这一行的每一列元素的值,初始化时的赋值顺序按矩阵的“行”存储原则。语法形式2:type[]arrayName=newtype[,]{{val11,val12,…,val1n},{val21,val22,…,val2n},…,{valm1,valm2,…,valmn}};默认size,由编译系统根据初始化表中花括号{}的个数确定行数,再根据{}内的数据确定列数,从而得出数组的大小。2.6.1数组语法形式3:type[,]arrayName={{val11,val12,…,val1n},{val21,val22,…,val2n},…,{valm1,valm2,…,valmn}};数组声明与初始化同时进行,还可以默认new运算符。语法形式4:type[,]arrayName;arrayName=newtype[size1,size2]{{val11,val12,…,val1n},{val21,val22,…,val2n},…,{valm1,valm2,…,valmn}};把数组声明与初始化分开在不同的语句中时,size1、size2同样可以默认,但也可以是变量。例如:int[,]a=newint[3,4]{{0,1,2,3},{4,5,6,7},{8,9,10,11}}; //使用语法形式1初始化int[,]a=newint[,]{{0,1,2,3},{4,5,6,7},{8,9,10,11}}; //使用语法形式2初始化int[,]a={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; //使用语法形式3初始化int[]a;a=newint[3,4]{{0,1,2,3},{4,5,6,7},{8,9,10,11}}; //使用语法形式4初始化2.6.1数组【例EX2_8】求两个矩阵的乘积。设计思路:两个矩阵相乘,必须第一个矩阵的列和第二个矩阵的行相等。实现步骤:(1)新建一个控制台项目项目命名为“EX2_8”。(2)添加代码代码如下所示。(3)运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.19所示。图2.19例EX2_8运行的结果2.6.2结构结构是值类型,通过结构可以把相关的多种类型数据(变量)组成整体来处理,组成结构类型的各个变量称为结构的数据成员(简称成员,或者成员变量)。所有的基类型都是结构类型,例如:int对应S32结构,string对应System.string结构,通过使用结构可以创建更多的值类型。语法形式:[访问修饰符]struct[结构类型名]{ [访问级别]<成员定义1> [访问级别]<成员定义2>; [访问级别]<成员定义3>; …}其中访问修饰符包括public(公共的)、protected(保护的)、private(私有的)它们的访问级别是由高到底的。2.6.2结构【例EX2_9】创建一个学生结构,并且声明一个学生类型对象stu,初始化,并输出学生信息。实现步骤:1.新建一个控制台项目项目命名为“EX2_9”。2.添加代码代码如下所示。3.运行程序按【Ctrl+F5】快捷键运行程序,结果如图2.20所示。图2.20例EX2_9运行的结果2.6.3枚举枚举类型是C#中又一种轻量级的值类型,用枚举来表达一组特定的值的集合行为,比如Windows窗体可选的状态,按钮控件的风格等。实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。枚举应用于有多个选择情况的场合,枚举类型为一组符号常数提供了一个类型名称。在枚举中的每个成员实际上是一个符号常数。例如:enumColor{ Red, Green, Blue}2.6.3枚举它声明了一个枚举类型Color,表示3种可能的情况:Red、Green和Blue。这里的3个值实际上是3个整数0、1、2,但与整数相比,使用枚举类型使程序的可读性更好,并且容易检查出错误。声明枚举类型,使用关键字enum。声明的基本语法格式如下:enum枚举名[:基本类型名]{
枚举成员
[=常数表达式], …}2.6.3枚举一个枚举成员的数值,既可以使用等号“=”显式地赋值,也可以不显式地赋值,而使用隐式赋值。隐式赋值按以下规则来确定值。(1)对第一个枚举成员,如果没有显式赋值,它的数值为0。(2)对其他枚举成员,如果没有显式赋值,它的值等于前一枚举成员的值加1。例如:enumColor{ Red, Green=10, Blue, Max=Blue}其中,Red的值为0,Green的值为10,Blue的值为11,Max的值为11。2.6.3枚举【例EX2_10】声明一个short基本类型的星期枚举,并使用不同的方法调用。实现步骤:1.新建一个控制台项目项目命名为“EX2_10”。2.添加代码代码如下所示。3.运行程序按【Ctrl+F5】快捷键运行程序,输入数字“951234867”,按回车键,结果如图2.21
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中级收入建筑合同范本
- 公司运输货物合同范本
- 保过合同范本
- 出资入股协议合同范本
- 买卖合同非住宅类合同范本
- 中介买房纠纷合同范本
- 仓房买卖合同范本
- 加工玉米采购合同范本
- 别墅购买合同范本
- 出租婴儿服装合同范本
- 2024年保安员考试题库【典型题】
- 餐饮行业系列研究之六:日本餐饮30年复盘与启示
- 2024年江苏卫生健康职业学院单招职业适应性测试题库及答案解析0
- 《中国陶瓷史》课件-3-陶与瓷
- 第一章创新意识课件
- 浙江省杭州市2022-2023学年七年级下学期语文期中质量检测试卷(含答案)
- 【真题】2023年南京市中考语文试卷(含答案解析)
- 数学教育的国际比较与交流
- 安徽安庆家乡介绍
- 自动测试系统第1章第1节测试系统发展综述
- 2024年河南省水务规划设计研究有限公司人才招聘笔试参考题库附带答案详解
评论
0/150
提交评论