第二章C#语言基础

上传人:hs****ma 文档编号:590642070 上传时间:2024-09-15 格式:PPT 页数:96 大小:2.57MB
返回 下载 相关 举报
第二章C#语言基础_第1页
第1页 / 共96页
第二章C#语言基础_第2页
第2页 / 共96页
第二章C#语言基础_第3页
第3页 / 共96页
第二章C#语言基础_第4页
第4页 / 共96页
第二章C#语言基础_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《第二章C#语言基础》由会员分享,可在线阅读,更多相关《第二章C#语言基础(96页珍藏版)》请在金锄头文库上搜索。

1、第第2章章 C#编程基础编程基础C#的基本数据类型、变量、常量、表达式、程序流程控制语句的基本数据类型、变量、常量、表达式、程序流程控制语句及数组等概念是及数组等概念是C#程序设计的基础,掌握这些基本知识是编写程序设计的基础,掌握这些基本知识是编写正确程序的前提。正确程序的前提。 主要内容主要内容2.1基本类型基本类型2.2变量与常量变量与常量2.3运算符与表达式运算符与表达式2.4选择语句选择语句2.5数组数组2.6综合应用综合应用基本编码规则基本编码规则1标识符和保留字标识符和保留字C#语言中,标识符是以字母、下划线(语言中,标识符是以字母、下划线(_)或)或开始的一个字符序列,后面可以跟

2、字母、下划开始的一个字符序列,后面可以跟字母、下划线、数字。线、数字。C#语言区分大小写。一般变量名首语言区分大小写。一般变量名首字母小写,后面各单词首字母大写;而常量、字母小写,后面各单词首字母大写;而常量、类名、方法、属性等首字母大写。类名、方法、属性等首字母大写。具有专门的意义和用途,不能当作一般的标识具有专门的意义和用途,不能当作一般的标识符使用,这些标识符称为保留字。符使用,这些标识符称为保留字。 2书写规则书写规则每行语句以每行语句以“;”结尾。结尾。空行和缩进被忽略。空行和缩进被忽略。多条语句可以处于同一行,之间用分号分隔即多条语句可以处于同一行,之间用分号分隔即可。可。 3注释

3、注释有三种类型的注释语句:有三种类型的注释语句:/注释一行注释一行/*一行或多行注释一行或多行注释*/XML注释方式注释方式2.1 数据类型数据类型C#语言中的数据类型划分语言中的数据类型划分C#语言的数据类型按内置和自定义划分有内置类型和构造类型。语言的数据类型按内置和自定义划分有内置类型和构造类型。 按数据的存储方式划分,有值类型和引用类型。按数据的存储方式划分,有值类型和引用类型。 值类型值类型各种值类型总是含有相应该类型的一个值。各种值类型总是含有相应该类型的一个值。 每每当把一个值赋给一个值类型时,该值实际上被当把一个值赋给一个值类型时,该值实际上被拷贝了。相比,对于引用类型,仅是引

4、用被拷拷贝了。相比,对于引用类型,仅是引用被拷贝了,而实际的值仍然保留在相同的内存位置。贝了,而实际的值仍然保留在相同的内存位置。C#的值类型可以归类如下:的值类型可以归类如下: 简单类型简单类型(Simple types ) 枚举类型枚举类型(Enumeration types) 结构类型结构类型(struct types)2.2.1 值类型所谓值类型就是一个包含实际数据的所谓值类型就是一个包含实际数据的量。当定义一个值类型的变量时,量。当定义一个值类型的变量时,C#会根据它所声明的类型,以堆栈方式会根据它所声明的类型,以堆栈方式分配一块大小相适应的存储区域给这分配一块大小相适应的存储区域给

5、这个变量,随后对这个变量的读个变量,随后对这个变量的读/写操写操作就直接在这块内存区域进行。作就直接在这块内存区域进行。 .例如:int iNum=10; / 分配一个32位内存区域给变量iNum,并将10放入该内存区域iNum=iNum+10; / 从变量iNum中取出值,加上10,再将计算结果赋给iNum图2.1 值类型操作示意图表2.1 C#简单类型C#关关键字字.NET CTS类型名型名说 明明范范围和精度和精度boolSystem.Boolean逻辑值(真或假)(真或假)true, falsesbyteSystem.SByte8位有符号整数位有符号整数类型型 128127byteSy

6、stem.Byte8位无符号整数位无符号整数类型型0255shortSystem.Int1616位有符号整数位有符号整数类型型 3276832767ushortSystem.UInt1616位无符号整数位无符号整数类型型065535intSystem.Int3232位有符号整数位有符号整数类型型 21474836482147483647cts是通用类型系统(Common Type System),clr是公共语言运行时(common language runtime),cls是公共语言定义(Common Language Specification)续表续表C#关关键字字.NET CTS类型名

7、型名说 明明范范围和精度和精度uintSystem.Uint3232位无符号整数位无符号整数类型型04294967295longSystem.Int6464位有符号整数位有符号整数类型型 92233720368547758089223372036854775807ulongSystem.UInt6464位无符号整数位无符号整数类型型018446744073709551615charSystem.Char16位字符位字符类型型所有的所有的Unicode编码字符字符floatSystem.Single32位位单精度浮点精度浮点类型型(大(大约7个有效十个有效十进制数位)制数位)doubleSyst

8、em.Double64位双精度浮点位双精度浮点类型型(大(大约1516个有效十个有效十进制数制数位)位)decimalSystem.Decimal128位高精度十位高精度十进制数制数类型型(大(大约2829个有效十个有效十进制数制数位)位) 表中“C#关键字”是指在C#中声明变量时可使用的类型说明符。引用类型引用类型包括class(类)、interface(接口)、数组、delegate(委托)、object和string。其中object和string是两个比较特殊的类型。object是C#中所有类型(包括所有的值类型和引用类型)的根类。string类型是一个从object类直接继承的密封类

9、型(不能再被继承),其实例表示Unicode字符串。 一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。 例如:string s1, s2;s1=ABCD; s2 = s1; 其中,s1、s2是指向字符串的引用变量,s1的值是字符串ABCD存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得s2、s1都是对ABCD的引用,如图2.2所示。 图2.2 引用类型赋值示意引用类型的值是引用类型实例的引用,特殊值null适用于所有引用类型,

10、它表明没有任何引用的对象。当然也可能有若干引用类型的变量同时引用一个对象的实例,对任何一个引用变量作出修改都会导致该对象的值的修改。 注意注意:堆栈是按先进后出(FILO)的原则存储数据项的一种数据结构;堆(heap)则是用于动态内存分配的一块内存区域,可以按任意顺序和大小进行分配和释放。C#中,值类型就分配在堆栈中,堆栈内存区域内保存着值类型的值,内存区域可以通过变量名来存取。引用类型分配在堆中,对象分配在堆时,返回的是地址,这个地址被赋值给引用。 C#用“装箱”和“拆箱”来实现值类型与引用类型之间的转换。“装箱”就是将值类型包装成引用类型的处理过程。当一个值类型被要求转换成一个object

11、对象时,“装箱”操作自动进行,它首先创建一个对象实例,然后把值类型的值复制到这个对象实例,最后由object对象引用这个对象实例。2.1.3 值类型与引用类型的关系例如: using System;class Demo public static void Main ( ) int x = 123; object obj1=x; / 装箱操作 x = x+100; / 改变x的值,此时obj1的值并不会随之改变 Console.WriteLine ( x= 0 , x ); / x=223 Console.WriteLine ( obj1= 0 , obj1 ); / obj1=123 该实例

12、的“装箱”操作说明如图2.3所示。“拆箱拆箱”操作与操作与“装箱装箱”相相反,它是将一个反,它是将一个object类型类型转换成值类型。首先检查由转换成值类型。首先检查由object引用的对象实例值类引用的对象实例值类型的包装值,然后把实例中型的包装值,然后把实例中的值复制到值类型的变量中的值复制到值类型的变量中注意:当一个注意:当一个“装箱装箱”操作操作把值类型转换为一个引用类把值类型转换为一个引用类型时,不需要显式地强制类型时,不需要显式地强制类型转换;而拆箱操作把引用型转换;而拆箱操作把引用类型转换到值类型时,由于类型转换到值类型时,由于它可以强制转换到任何可以它可以强制转换到任何可以相

13、容的值类型,所以必须显相容的值类型,所以必须显式地强制类型转换。式地强制类型转换。using System;class Demo public static void Main ( ) int x = 123, y; object obj1=x; / 装箱操装箱操作作 x = x+100; / 改变改变x的值,此时的值,此时obj1的值并不会随之改变的值并不会随之改变 y = (int) obj1; / 拆箱操拆箱操作,必须进行强制类型转换作,必须进行强制类型转换 Console.WriteLine ( x= 0 , x ); / x=223 Console.WriteLine ( obj1=

14、 0 , obj1 ); / obj1=123 2.2 变量与常量变量与常量2.2.1 常量常量 常量,顾名思义就是在程序运行期间其值不会改变的量,它通常可以分为字面常量和符号常量。每一种值类型都有自己的常量表示形式。整数常量: 对于一个整数值,默认的类型就是能保存它的最小整数类型,其类型可以分为int、uint、long或ulong。如果默认类型不是想要的类型,可以在常量后面加后缀(U或L)来明确指定其类型。在常量后面加L或l(不区分大小写)表示长整型。例如:32 / 这是一个int类型32L / 这是一个long类型在常量后面加U或u(不区分大小写)表示无符号整数。例如:128U / 这是

15、一个uint 类型128UL / 这是一个ulong类型整型常量不加特别说明默认为十进制,在数值前面加0x(或0X)则表示十六进制数,十六进制基数用09、AF(或af),例如:0x20 / 十六进制数20,相当于十进制数320x1F / 十六进制数1F,相当于十进制数31一般带小数点的数或用科学计数法表示的数都被认为是浮点数,它的数据类型默认为double类型,但也可以加后缀符表明三种不同的浮点格式数。在数字后面加F(f)表示是float类型。在数字后面加D(d)表示是double类型。在数字后面加M(m)表示是decimal类型。例如: 3.14 , 3.14e2, 0.168E2 / 这些

16、都是double类型常量,3.14F, 0.168f / 这些都是float类型常量3.14D, 0.168d / 这些都是double类型常量3.14M, 0.168m / 这些都是decimal类型常量2浮点常量浮点常量字符常量,是用单引号括起来的单个字符,如A,它占16位,以无符号整型数的形式存储这个字符所对应的Unicode代码。单引号括起的一个字符,如A。十六进制的换码系列,以“x”或“X”开始,后面跟4位十六进制数,如 X0041 。Unicode码表示形式,以“U”或“u”开始,后面跟4位十六进制数,如 U0041。显式转换整数字符代码,如(char)65。字符转义系列,如表2.

17、2所示。3字符常量字符常量 转 义 字字 符符含含 义Unicode码转 义 字字 符符含含 义Unicode码单引号引号u0027b退格符退格符u0008双引号双引号u0022f走走纸换页符符u000C反斜反斜线字符字符u005Cn换行符行符u000A0空字符空字符u0000r回回车符符u000Da警警铃符符u0007t水平制表符水平制表符u0009v垂直制表符垂直制表符u000B表表2.2 字符转义符字符转义符字符串常量是用双引号括起的零个或多个字符序列。C#支持两种形式的字符串常量,一种是常规字符串,另一种是逐字字符串。(1)常规字符串。双引号括起的一串字符,可以包括转义字符。例如:He

18、llo, WorldnC:windowsMicrosoft / 表示字符串 C:windowsMicrosoft(2)逐字字符串。在常规的字符串前面加一个,就形成了逐字字符串,它的意思是字符串中的每个字符均表示本意,不使用转义字符。如果在字符串中需用到双引号,则可连写两个双引号来表示一个双引号。例如:C:windowsMicrosoft / 与 C:windowsMicrosoft 含义相同He saidHello to me / 与He saidHello to me 含义相同4字符串常量字符串常量5布尔常量布尔常量它只有两个值:true和false。6符号常量符号常量在声明语句中,可以声明

19、一个标识符常量,但必须在定义标识符时就进行初始化,并且定义之后就不能再改变该常量的值。具体的格式为:const 类型 标识符=初值例如:const double PI=3.14159变量是在程序运行过程中其值可以改变的量,它是一个已命名的存储单元,通常用来记录运算的中间结果或保存数据。在C#中,每个变量都具有一个类型,它确定哪些值可以存储在该变量中。变量的特性由类型来决定。C#中的变量必须先声明后使用。声明变量包括变量的名称、数据类型,必要时指定变量的初始值。声明变量的形式: 类型 标识符表;或 类型 标识符=初值 , ;2.2.2 变量变量C#是大小写敏感的语言,name、Name分别代表不

20、同的标识符,在定义和使用时要特别注意。另外变量名不能与C#中的关键字相同,除非标识符是以作为前缀的。例如: int x ; / 合法float y1=0.0, y2 =1.0, y3 ; / 合法,变量说明的同时可以设置初始数值string char / 不合法,因为char是关键字string char / 合法C#允许在任何模块内部声明变量,每次进入声明变量所在的模块时,则创建变量并分配存储空间,离开这个模块时,则销毁这个变量并收回分配的存储空间。实际上,变量只在这个模块内有效,所以称为局部变量,这个模块区域就是变量的作用域表达式是由操作数和运算符构成的。操作数可以是常量、变量、属性等;运

21、算符指示对操作数进行什么样的运算。C#运算符有一元运算符(如+)、二元运算符(如+,*)、三元运算符(如? : )。 按运算功能来分,基本的运算符可以分为以下几类:(1)算术运算符 (2)关系运算符 (3)逻辑运算符 (4)位运算符(5)赋值运算符 (6)条件运算符 (7)其他(分量运算符 ,下标运算符 等) 2.3 运算符与表达式运算符与表达式2.3.1 算术运算符算术运算符运算运算 符符含含 义示例(假示例(假设x,y是某一数是某一数值类型型的的变量)量)运运 算算 符符含含 义示例(假示例(假设x,y是某一数是某一数值类型型的的变量)量)+加加x + y ; x+3 ;%取模取模x %

22、y ; 11%3 ; 11.0 % 3; 减减x y ; y 1 ;+递增增+x ; x+ ;*乘乘x * y ; 3*4 ; 递减减 x ; x ;/除除x / y ; 5/2; 5.0/2.0 ;算术运算符作用的操作数类型可以是整型也可以是浮点型,运算符如表2.3所示其中: “+*/ ”运算与一般代数意义及其他语言相同,但需要注意:当“/”作用的两个操作数都是整型数据类型时,其计算结果也是整型。例如:4/2 / 结果等于2 5/2 / 结果等于25/2.0 / 结果等于2.5 “%”取模运算,即获得整数除法运算的余数,所以也称取余。例如: 11%3 / 结果等于212%3 / 结果等于0

23、11.0%3 / 结果等于2,这与C/C+不同,它也可作用于浮点类型的操作数 “+”和“”递增和递减运算符是一元运算符,它作用的操作数必须是变量,不能是常量或表达式。要区分前缀运算后缀运算例如:+x 先将x加一个单位,然后再将计算结果作为表达式的值。x+ 先将x的值作为表达式的值,然后再将x加一个单位。不管是前缀还是后缀,操作数都加了一个单位,但出现在表达式运算中是有区别的。例如: int x , y ;x=5 ; y=+x ; / x和y的值都等于6x=5 ; y=x+ ; / x的值是6,y的值是5 2.3.2 关系运算符关系运算符运运 算算 符符操操 作作结果(假果(假设x,y是某相是某

24、相应类型的操作数)型的操作数)xy如果如果x大于大于y,则为true,否,否则为false=x=y如果如果x大于等于大于等于y,则为true,否,否则为falsexy如果如果x小于小于y,则为true,否,否则为false=x右移右移左移左移按位异或运算有一个特别的属性,假设有两个整型数x和 y,则表达式 (x y) y值还原为x,利用这个属性可以创建简单的加密程序。例如using System;class Encode public static void Main( ) char ch1 = O , ch2 = K ; int key = 0x1f ; Console.WriteLine

25、(明文: + ch1 + ch2 ) ; ch1 = (char) (ch1 key ) ; ch2 = (char) (ch2 key ) ; Console.WriteLine (密文: + ch1 + ch2 ) ; ch1 = (char) (ch1 key ) ; ch2 = (char) (ch2 key ) ; Console.WriteLine (解码: + ch1 + ch2 ) ; 移位运算符有两个:一个左移()。语法形式:value num_bits左操作数value是要被移位的值,右操作数num_bits是要移位的位数(1)左移。将给定的value向左移动num_bit

26、s位,左边移出的位丢掉,右边空出的位填0。例如:0x1A 2。右移过程如图2.8所示。例如:0x8AU 2。右移过程如图2.9所示。右移运算符的作用相当于将value的值整除以位运算练习62=?1=2);赋值运算符有两种形式,一种是简单赋值运算符,另一种是复合赋值运算符。1简单赋值运算符语法形式:var = exp 2复合赋值运算符在进行如x = x +3 运算时,C#提供一种简化方式x +=3,这就是复合赋值运算。语法形式:var op= exp / op 表示某一运算符等价的意义是: var = var op exp 2.3.5 赋值运算符赋值运算符 运运 算算 符符用用 法法 示示 例例

27、等价表达等价表达式式运运 算算 符符用用 法法 示示 例例等价表达式等价表达式+=x += yx = x + y&=x &= yx = x & y =x = yx = x y|=x |= yx = x | y*=x *= yx = x * y=x = yx = x y/=x /= yx = x / y=x = yx = x y%=x %= yx = x % y=x = yx = x y ? x : y ; / z 的值就是的值就是x,y中较大的一个值中较大的一个值 z = x =0 ? x : x ; / z的值就是的值就是x的绝对值的绝对值条件运算符条件运算符“? :”是是C#中唯一一个三元

28、运算符。中唯一一个三元运算符。2.3.6 条件运算符当一个表达式含有多个运算符时,C#编译器需要知道先做哪个运算,这就是所谓的运算符的优先级,它控制各个运算符的运算顺序 当操作数出现在具有相同优先级的运算符之间时,如表达式“1062”按从左到右计算的结果是2,如果按从右到左计算,结果是6。当然“”运算符是按从左到右的次序计算的,也就是左结合。 再如表达式“x=y=2”,它在执行时是按从右到左运算的,即先将数值2赋给变量y,再将y的值赋给x。所以“=”运算符是右结合的。 运算符的优先级和结合性控制着运算的执行顺序,也可以用圆括号“()”显式地标明运算顺序,如表达式“(x+y)* 2”2.3.7

29、运算符的优先级与结合性表2.9 运算符的优先级与结合性 类 别运运 算算 符符结 合合 性性初等初等项. ( ) new typeof checked unchecked 从左到右从左到右一元后一元后缀+ 从右到左从右到左一元前一元前缀+ + ! (T) (表达式表达式)从右到左从右到左乘法乘法* / % 从左到右从左到右加法加法+ 从左到右从左到右移位移位从左到右从左到右关系和关系和类型型检测 = is as 从左到右从左到右相等相等= !=从左到右从左到右逻辑与与&从左到右从左到右逻辑异或异或从左到右从左到右逻辑或或|从左到右从左到右条件与条件与&从左到右从左到右条件或条件或|从左到右从左

30、到右条件条件? :从右到左从右到左赋值= *= /= %= += = = &= = |=从右到左从右到左判断闰年的例子 int year=2008;bool leap=false;leap=(year%400=0)|(year%100!=0) & (year%4=0);Console.WriteLine(0是:1,year,leap);1下列语句片段 int a=10,b=4,c=20,d=6; Console.WriteLine(a+*b+c*-d); 的结果为( ) (A)144(B)28 (C)140(D)不能执行 2 int n=5;n=2;Console.WriteLine(n);在

31、表达式中,操作数的数据类型可以不同,只要相互兼容即可。当表达式中混合了几种不同的数据类型时,C#会基于运算的顺序将它们自动转换成同一类型。下面是C#的类型提升规则。(1)一个操作数是decimal类型,另一个操作数提升为decimal,但float或double类型不能自动提升为decimal。(2)一个操作数是double类型,另一个操作数提升为double。(3)一个操作数是float类型,另一个操作数提升为float。(4)一个操作数是ulong类型,另一个操作数提升为ulong,但带符号数,如sbyte、short、int或long不能自动提升。(5)一个操作数是long类型,另一个操

32、作数提升为long。(6)一个操作数是uint类型,另一个操作数若是sbyte、short或int,那么这两个操作数都提升为long。(7)一个操作数是uint类型,另一个操作数提升为uint。(8)除以上情况之外,两个数值类型的操作数都提升为int类型。 2.3.8 表达式中的类型转换表达式中的类型转换 :强制类型的转换形式:(类型)表达式例如: decimal d1, d2 ;float f1;d1 = 99.999; f1 = 0.98;d2 = d1 + f1 ; / 出错,因为float类型的f1不能自动转换成decimal类型d2 = d1 + (decimal) f1; 注意:注

33、意:1. 当从占用内存较多的数据类型向占用内存较少的数据类型做强制转换时,有可能会发生数据丢失。例如,从long数据类型强制转换成int类型时,如果long类型的值超过int所能表示的范围,则会丢失高位数据。2. 虽然char类型属于整数类型的一种,但却不允许直接将一个整型数赋给一个char类型的变量,解决的方法就是用强制类型转换。3. 布尔类型不能进行数据类型转换。上机运行下列程序上机运行下列程序,注意观察输出的结果注意观察输出的结果for(int i=20302;i=20322;i+) Console.WriteLine(char)i); 任何程序都可以且只能由三种基本流程结构构成,即顺序

34、结构、分支结构和循环结构。1.顺序结构是三种结构中简单的一种。即语句按照书写的顺序依次执行;2.分支结构又称为选择结构,它将根据计算所得的表达式的值来判断应选择执行哪一个流程分支;3.循环结构则是在一定条件下反复执行一段语句的流程结构。 2.4.1 结构化程序设计的三种基本流程图2.10 程序设计的三种控制流程分支语句就是条件判断语句,它能让程序在执行时根据特定条件是否成立而选择执行不同的语句块。C#提供两种分支语句结构,if语句和switch语句。 2.4.2 分支语句1if语句1. if框架语法形式:if (条件表达式) 语句;2. if_else框架语法格式:if (条件表达式) 语句1

35、;else 语句2;3. if_else if框架语法形式:if (条件表达式1)语句1 ;else if (条件表达式2) 语句2 ;else if (条件表达式3) 语句3 ; else 语句n ; 4. 嵌套的if语句 switch语句是一个多分支结构的语句,它所实现的功能与if_else if结构相似,但在大多数情况下,switch语句表达方式更直观、简单、有效。2switch语句语法形式:switch (表达式) case 常量1:语句序列1; / 由零个或多个语句组成 break ; case 常量2:语句序列2; break ;. default: / default 是任选项,

36、可以不出现语句序列n; break ;使用注意(1)switch语句表达式必须是整数类型,case常量必须与表达式类型兼容,case常量的值必须互异,不能有重复。(2)“不穿透”规则(3)可以有两个或多个case前缀指向相同的语句序列。 using System;class StudentGrade public static void Main( ) Console.Write (输入学生百分制的成绩:); int Grade = (int)Console.Read ( ) ; switch ( Grade / 10 ) case 9: case 10: Console.WriteLine

37、(你的成绩为:A); break; case 8: Console.WriteLine (你的成绩为:B); break; case 7: Console.WriteLine (你的成绩为:C); break; case 6: Console.WriteLine (你的成绩为:D); break; default: Console.WriteLine (你的成绩为:E); break; 【例例2.1】 从键盘输入学生的百分制成绩,换算成等级制成绩 int x=0,y=10; if(x=0)=0)|(y=20)=20) Console.WriteLine(现在现在 y 的值是的值是0:“,y);

38、 int a=0,b=10; if(a=0)=0)|(b=20)=20) Console.WriteLine(现在现在 b 的值是的值是:0“,b); 循环语句是指在一定条件下,重复执行一组语句,它是程序设计中的一个非常重要也是非常基本的方法。C#提供了4种循环语句:while、do_while、for和foreach。foreach语句主要用于遍历集合中的元素。 2.4.3 循环语句1while 语句语法形式: while (条件表达式) 循环体语句;如果条件表达式为真(true),则执行循环体语句。while语句执行流程如图2.11所示 图2.11 while语句执行流程图 【例例2.2】

39、 用while语句求using System;class Sum100 public static void Main( ) int Sum,i; Sum=0; i=1; while(i=100) Sum+=i; i+; 2do_while 语句语法形式:do 循环体语句 ;while(条件表达式)该循环首先执行循环体语句,再判断条件表达式。如果条件表达式为真(true),则继续执行循环体语句。do_while循环语句执行流程如图2.12所示。图2.12 do_while语句执行流程图 【例例2.3】 用do_while语句求using System;public class Sum100 p

40、ublic static void Main ( ) int Sum , i ; Sum=0; i=1; do Sum+=i; i+; while (i=100) Console.WriteLine (Sum is + Sum); while语句与do_while语句很相似,它们的区别在于while语句的循环体有可能一次也不执行,而do_while语句的循环体至少执行一次。 3for 语句语法形式:for(表达式1; 表达式2; 表达式3) 循环体语句;一般情况下,表达式1是设置循环控制变量的初值;表达式2是布尔类型的表达式,作为循环控制条件;表达式3是设置循环控制变量的增值(正负皆可)。fo

41、r语句执行流程如图2.13所示。图2.13 for语句执行流程图【例例2.4】 用for语句求using System;public class Sum100 public static void Main ( ) int Sum , i ; Sum=0; for (i=1; i0; i ) / i也可以每次减1 Sum+=i; Console.WriteLine (Sum is + Sum); 【例例2.5】 用for语句求 using System; public class Sum100 public static void Main ( ) int Sum , i ; for (Sum

42、=0, i=1; i=100; i+) Sum+=i; Console.WriteLine (Sum is + Sum); for (Sum=0, i=1; i=100; Sum+=i, i+) ; / 循环体是一空语句 Console.WriteLine (Sum is + Sum); 【例例2.6】 用for语句求 using System;public class Sum100 public static void Main ( ) int Sum , i ; for (Sum=0, i=1; i100) break; / 但条件满足时,但条件满足时,break语句跳出循环语句跳出循环

43、Console.WriteLine (Sum is + Sum); Sum=0; i=1; for ( ; ; ) / 三个表达式都默认三个表达式都默认 Sum+=i+; if (i100) / 这种情况一般都会用这种情况一般都会用if语句来设置跳出循环语句来设置跳出循环 break; Console.WriteLine (Sum is + Sum); 【例例2.7】 用for语句求using System;public class Sum100 public static void Main ( ) int Sum =0; for (int i=1; i=100; i+) / i只在这个只在

44、这个for循环中有循环中有效效 Sum+=i; Console.WriteLine (i = + i ); / 编译出错,编译出错,i这时已经这时已经无效无效 Console.WriteLine (Sum is + Sum); (1)for循环语句,表达式1和表达式3可引入逗号运算符“,”,这样可以对若干变量赋初值或增值。(2)for循环的三个表达式可以任意默认,甚至全部默认,如果表达式2默认就约定它的值是true。但不管哪个表达式默认,其相应的分号“;”不能默认。(3)可在for循环内部声明循环控制变量。如果循环控制变量仅仅只在这个循环中用到,那么为了更有效地使用变量,也可在for循环的初始

45、化部分(表达式1)声明该变量,当然这个变量的作用域在这个循环内。for循环的一些变化特点:循环的一些变化特点:跳转语句用于改变程序的执行流程,转移到指定之处。C#中有4种跳转语句:continue、break、return、goto语句。它们具有不同的含义,用于特定的上下文环境之中。2.4.4 跳转语句1continue语句 语法形式:continue ;continue语句只能用于循环语句中,它的作用是结束本轮循环,不再执行余下的循环体语句,对while和do_while结构的循环,在continue执行之后,就立刻测试循环条件,以决定循环是否继续下去;对for结构循环,在continue执

46、行之后,先求循环增量部分,然后再测试循环条件。using System;public class Factor3 public static void Main ( ) for (int n =1; n=100; n+) if ( n % 3 !=0 ) continue ; / 如果n不能被3整除,则直接进入下一轮循环 Console.WriteLine (n ); / 只有能被3整除的数,才会执行到此 【例例2.8】 输出1100之间含有因子3的数。2break语句语法形式: break;break语句只能用于循环语句或switch语句中。如果在switch语句中执行到break语句,则立

47、刻从switch语句中跳出,转到switch语句的下一条语句;如果在循环语句执行到break语句,则会导致循环立刻结束,跳转到循环语句的下一条语句。不管循环有多少层,break语句只能从包含它的最内层循环跳出一层。例例2.9】 求1100之间的所有素数。using System;public class Prime public static void Main ( ) int m , k , n=0 ; for ( m =2; m100; m+=2 ) for ( k=2; k=m ) Console.Write (0, 4, m ); if (+n %10 =0) Console.Writ

48、eLine (n ); 3return语句语法形式: return;或 return 表达式;return语句出现在一个方法内。在方法中执行到return语句时,程序流程转到调用这个方法处。如果方法没有返回值(返回类型修饰为void),则使用“return”格式返回;如果方法有返回值,那么使用“return表达式”格式,其后面跟的表达式就是方法的返回值。例例2.9】 求1100之间的所有素数。using System;public class Prime100 public static bool prime (int m) for (int i=2; im ; i+) if ( m % i

49、=0 )return false; return true;public static void Main ( ) int m , k , n=1 ; Console.Write (0, 4,2 ); for ( m =3; m100; m+=2 ) if(prime(m) 4goto语句语法形式:goto 标号;其中,“标号”就是定位在某一语句之前的一个标识符,称为标号语句。语法形式:标号:语句;它给出goto语句转向的目标。值得注意的是,goto 语句不能使控制转移到另一个语句块内部,更不能转到另一个函数内部。另外,goto语句如果用在switch语句中,有如下形式。语法形式:goto c

50、ase 常量;goto default ;它只能在本switch语句中从一种情况转向另一种情况。【例例2.11】 用goto语句写“百钱百鸡问题”程序。公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元钱可买公鸡、母鸡、小鸡各多少只?using System;public class Chook100 public static void Main ( ) int x , y , z ; x=y=z=0; for ( x=1; x=100/5; x+)for ( y=1; y=100/3; y+) z = 100xy; if (z%3=0 & 5*x+3*y+z/3=100)goto end

51、; / 直接从内循环中转出,跳了二层循环,这是break语句做不到的end: Console.WriteLine(Cock=0 Hen=1 Chick=2,x,y,z);Console.Read ();程序运行结果如下 :【例例2.12】 用break语句写“百钱百鸡问题”程序。公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元钱可买公鸡、母鸡、小鸡各多少只? using System;public class Chook100 public static void Main ( ) int x , y , z ; bool flag=false; x=y=z=0; for ( x=1; x

52、=100/5; x+) for ( y=1; y=100/3; y+) z = 100xy;if (z%3=0 & 5*x+3*y+z/3=100) flag=true; break; / 这个break语句只能跳出最内一层循环 if (flag) break; / 这个break语句跳出最外一层循环Console.WriteLine(Cock=0 Hen=1 Chick=2,x,y,z);Console.Read (); using System;class Schedulestatic void Main()Console.Write(输入一个06之间的数字代表星期日至星期六);int w

53、eek;string sline;RepIn: sline=Console.ReadLine ();week=int.Parse (sline);switch ( week )case 0:case 6: Console.WriteLine (今天是周末,自行安排!); break;case 1: Console.WriteLine (今天的课程是:哲学、英语、C#);break;【例例2.13】 缩写课程表查询程序。 case 2: Console.WriteLine (今天的课程是:数学、英语、体育);break;case 3: Console.WriteLine (今天下午政治学习);g

54、oto case 1;case 4: Console.WriteLine (今天的课程是:数学英语、C#);break; case 5: Console.WriteLine (今天下午打扫卫生);goto case 2; default: Console.WriteLine (输入数据有错,请重新输入!);goto RepIn; Console.Read ();程序运行结果如下:数组是一种包含若干变量的数据结构,这些变量都具有相同的数据类型并且排列有序,因此可以用一个统一的数组名和下标唯一地确定数组中的元素。C#中的数组主要有三种形式:一维数组、多维数组和不规则数组。2.5 数组2.5.1 数

55、组的定义1一维数组(1)一维数组的声明语法形式:type arrayName ;其中: type可以是C#中任意的数据类型。 表明后面的变量是一个数组类型,必须放在数组名之前。 arrayName数组名,遵循标识符的命名规则。2)创建数组对象语法形式:type arrayName; / 数组声明arrayName = new type size; / 创建数组实例其中: size表明数组元素的个数。声明数组和创建数组实例也可以合在一起写:type arrayName = new type size ; 2多维数组(1)多维数组的声明语法形式:type , , , arrayName ;多维数组

56、就是指能用多个下标访问的数组。在声明时方括号内加逗号,就表明是多维数组,有n个逗号,就是n+1维数组。例如: int , score; / score是一个int类型的二维数组float , , table; / table是一个float类型的三维数组(2)创建数组对象声明数组和创建数组分别进行。语法形式:type , , , arrayName ; / 数组声明arrayName = new type size1, size2, size3; / 创建数组实例 size1, size2, size3分别表明多维数组每一维的元素个数。声明数组和创建数组实例也可以合在一起写。语法形式:type

57、 , , , arrayName = new type size1, size2, size3 ; 一维数组和多维数组都属于矩形数组,而C#所特有的不规则数组是数组的数组,在它的内部,每个数组的长度可以不同,就像一个锯齿形状。(1)不规则数组的声明语法形式:type arrayName ;方括号 的个数与数组的维数相关。例如: int jagged ; / jagged是一个int类型的二维不规则数组(2)创建数组对象以二维不规则数组为例:3不规则数组 在用new运算符生成数组实例时,若没有对数组元素初始化,则取它们的默认值。对数值型变量默认值为0,引用型变量默认值为null。当然数组也可以在

58、创建时按照自己的需要进行初始化,需要注意的是,初始化时不论数组的维数是多少,都必须显式地初始化所有数组元素,不能进行部分初始化。2.5.2 数组的初始化语法形式1: type arrayName = new type size val1, val2, ,valn;数组声明与初始化同时进行时,size就是数组元素的个数,它必须是常量,而且应该与大括号内的数据个数一致。语法形式2: type arrayName = new type val1, val2, ,valn ;默认size,由编译系统根据初始化表中的数据个数,自动计算数组的大小。语法形式3: type arrayName = val1,

59、 val2, ,valn ;数组声明与初始化同时进行,还可以默认new运算符。语法形式4: type arrayName ;arrayName = new type size val1, val2,valn ;把声明与初始化分开在不同的语句中进行时,size同样可以默认,也可以是一个变量。1一维数组初始化 多维数组初始化是将每维数组元素设置的初始值放在各自的大花括号内,下面以最常用的二维数组为例来讨论。语法形式1: type , arrayName = new type size1, size2 val11, val12, ,val1n , val21, val22, ,val2n , , v

60、alm1, valm2, ,valmn ;数组声明与初始化同时进行,数组元素的个数是size1*size2,数组的每一行分别用一个花括号括起来,每个花括号内的数据就是这一行的每一列元素的值,初始化时的赋值顺序按矩阵的“行”存储原则。语法形式2: type arrayName = new type , val11, val12, ,val1n , val21, val22,val2n , , valm1, valm2, ,valmn ;默认size,由编译系统根据初始化表中花括号的个数确定行数,再根据内的数据确定列数,从而得出数组的大小。2多维数组初始化语法形式3: type , arrayNa

61、me = val11, val12, ,val1n , val21, val22, ,val2n , , valm1, valm2, ,valmn ;数组声明与初始化同时进行,还可以默认new运算符。语法形式4: type , arrayName ;arrayName = new type size1, size2 val11, val12, ,val1n , val21, val22, ,val2n , , valm1, valm2, ,valmn ;把声明与初始化分开在不同的语句中时,size1、size2同样可以默认,但也可以是变量。例如:以下数组初始化实例都是等同的。int , a =

62、 new int 3,4 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ;int , a = new int , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ;int , a = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ;int a ;a = new int 3, 4 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ;下面以二维不规则数组为例来讨论。不规则数组是一个数组的数组,所以它的初始化通常是分步骤进行的。语法形式:type arrayName = new type siz

63、e ;size可以是常量或变量,后面一个中括号 是空着的,表示数组的元素还是数组且其中的每一个数组的长度是不一样的,需要单独使用new运算符生成。语法形式:arrayName0 = new type size0 val1, val2, , valn1;arrayName1 = new type size1 val1, val2, , valn2;例如: char st1 = new char 3 ; / st1是由三个数组组成的数st10 = new char S, e, p, t, e, m, b, e, r st11 = new char O, c, t, o, b, e, rst12 =

64、 new char N, o, v, e, m, b, e, r ;3不规则数组初始化一个数组具有初值时,就可以像其他变量一样被访问,既可以取数组元素的值,又可以修改数组元素的值。在C#中是通过数组名和数组元素的下标来引用数组元素的。1一维数组的引用语法形式: 数组名下标下标数组元素的索引值,实际上就是要访问的那个数组元素在内存中的相对位移,记住,相对位移是从0开始的,所以下标的值从0到数组元素的个数1为止。2.5.3 数组元素的访问using System;class MaxMin public static void Main ( ) int max, min; int queue = n

65、ew int 10 89, 78, 65, 52, 90, 92, 73, 85, 91, 95 ; max = min = queue0; for ( int i = 1; imax) max=queuei; if (queueimin) min=queuei; Console.WriteLine(最大数是0,最小数是1, max, min ); 【例例2.14】 定义一个数组,存放一组数据,找出该组数中最大数和最小数。语法形式:数组名下标1, 下标2, ,下标n【例例2.15】 求两个矩阵的乘积。假定一个矩阵A为3行4列,另一个矩阵B为4行3列,根据矩阵乘法的规则,其乘积C为一个3行3列的

66、矩阵。using System;class matrixpublic static void Main() int i,j,k; int , a = new int 3,4 1,2,3,4,5,6,7,8, 9,10,11,12; int , b = new int 4,3 12,11,10,9,8,7,6,5,4, 3,2,1; int , c = new 3, 3; for (i=0; i3; i+) for (j=0; j3; j+) for (k=0;k4;+k) ci, j+= ai, k*bk, j; for (i=0; i3; +i) for (j=0; j3; +j) Cons

67、ole.Write (0, 4:d, ci, j); Console.WriteLine ( ); 2多维数组的引用 语法形式:数组名下标1下标2下标n【例例2.16】 打印杨辉三角形。using System;class YH_tri public static void Main() int i, j, k, m; k = 7; int Y = new intk; / 定义二维锯齿状数组Y for (i = 0; i Y.Length; i+) / Y.Length返回的是Y数组的长度,7 Yi = new inti + 1; Yi0 = 1; Yii = 1; for (i = 2; i

68、 Y.Length; i+) for (j = 1; j Yi.Length 1; j+) / Yi.Length是Yi这个数组的长度 Yij = Yi 1j 1 + Yi 1j; for (i = 0; i Y.Length; i+)3不规则数组的引用 for (j = 0; j Yi.Length; j+) Console.Write(0,5:d, Yij); Console.WriteLine(); Console.Read(); 程序运行结果如下:在C#中,System.Array类型是所有数组类型的抽象基类型,所有的数组类型均由它派生,这样设计的好处是任何数组都可以使用System.

69、Array具有的属性及方法。例如,System.Array有一个Length属性,通过它可以获取数组的长度;它有一个GetLength(n)方法,用它可以得到第n维的数组长度(n从0开始)。程序中利用这个属性和方法,可以有效地防止数组下标越界。2.5.4 数组与System.Array using System;class matrixpublic static void Main()int i,j,k;int , a = new int 3,4 1,2,3,4,5,6,7,8, 9,10,11,12;int , b = new int 4,3 12,11,10,9,8,7,6,5,4, 3,

70、2,1;int , c = new int 3, 3;for (i=0; ic.GetLength(0); i+) / c.GetLength(0)是c数组第一维的长度for (j=0; jc.GetLength(1); j+) / c.GetLength(1)是c数组第二维的长度for (k=0;k4;+k)ci, j+= ai, k*bk, j;for (i=0; i3; +i)【例例2.17】 求两个矩阵的乘积。假定一个矩阵A为 3 行 4 列,另一个矩阵B为 4 行 3列,根据矩阵乘法的规则,其乘积C为一个 3 行 3 列的矩阵。for (j=0; j= 60) passed+; Co

71、nsole.Write(0,4:d, x); Console.WriteLine(n及格率:0:P, (double)passed / score.Length); Console.Read(); 程序运行结果如下:【例例2.18】 统计一组考试成绩中及格的人数并打印及格的分数,计算及格率 【例例2.19】 扑克牌游戏。用计算机模拟洗牌,分发给4个玩家并将4个玩家的牌显示出来。基本思路:用一维数组Card存放52张牌(不考虑大、小王),二维数组Player存放4个玩家的牌。用三位整数表示一张扑克牌,最高位表示牌的种类,后两位表示牌号。例如:101,102,113分别表示红桃A,红桃2,红桃K。

72、201,202,213分别表示方块A,方块2,方块K。301,302,313分别表示梅花A,梅花2,梅花K。401,402,413分别表示黑桃A,黑桃2,黑桃K。程序:using System;class TestCardstatic void Main(string args) int i, j, temp;Random Rnd = new Random();int k;int Card = new int 52;int , Player=new int 4,13;2.6 综合应用实例 for (i=0; i4; i+) / 52张牌初始化for (j=0; j13; j+)Cardi*13

73、+j=(i+1)*100+j+1; Console.Write (How many times for card: );string s=Console.ReadLine ();int times=Convert.ToInt32 (s);for (j=1;j=times; j+)for (i=0;i52;i+)k=Rnd.Next (51i+1)+i; / 产生i到52之间的随机数temp=Cardi;Cardi=Cardk;Cardk=temp;k=0;for (j=0;j13;j+) / 52张牌分发给4个玩家for (i=0;i4;i+)Playeri,j=Cardk+;for (i=0

74、;i4;i+) / 显示4个玩家的牌Console.WriteLine (玩家0的牌:,i+1); for (j=0;j13;j+)k=(int)Playeri,j/100; / 分离出牌的种类switch (k) case 1: / 红桃s=Convert.ToString (x0003);break;case 2: / 方块s=Convert.ToString (x0004);break; case 3: / 梅花s=Convert.ToString (x0005);break; case 4: / 黑桃 s=Convert.ToString (x0006);break; k=Playeri,j%100; / 分离出牌号switch (k) case 1:s=s+A;break;case 11: s=s+J;break;case 12:s=s+Q;break;case 13: s=s+K;break;default:s=s+Convert.ToString (k);break;Console.Write (s);if (j12) Console.Write (, );elseConsole.WriteLine ( );Console.Read ();程序运行结果如下:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号