




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章C#基础知识2.1声明C#中的变量和常量
2.2C#中数据类型的分类 2.3装箱和拆箱
2.4C#中的运算符与表达式2.5C#中的选择语句
2.6C#中的循环语句
2.7数组、结构和枚举
2.8综合案例:冒泡排序
本章小结
练习与作业
上机部分(二) 学习目标●掌握在C# 中定义变量和常量●掌握C# 中的基本数据类型●理解装箱和拆箱的概念●掌握C# 中的运算符和表达式●掌握C# 中的选择结构和循环结构●学会定义和使用数组,了解结构和枚举2.1声明C# 中的变量和常量2.1.1变量变量是在程序运行过程中其值可以改变的量,它是一个已命名的存储单元,通常用来记录运算中间结果或保存数据。在C# 中,每个变量都具有一个类型,它确定哪些值可以存储在该变量中,变量的值可以通过赋值和运算等操作来改变。使用变量有一条十分重要的原则:先定义,后使用,变量可以在定义时赋值,也可以在定义之后通过赋值语句赋值。另外,在一个程序中只能对一个变量定义一次。变量声明格式:
[访问修饰符]数据类型变量名称[=初始值];
例如:
intage=8; //年龄一般用整型表示
stringname; //姓名一般用字符串类型也可以同时声明一个或多个给定类型的变量,例如:
inta=1,b=2,c=3;
下面从变量的命名和变量类型来理解变量。
1.命名变量
C#代码中使用的每一个变量都必须有一个名称。为变量起名的时候要遵循C# 语言的规定:
(1)变量名必须是由字母和数字组成的字符串,长度没有限制,但首字符必须为字母、下划线或@,其后的字符可以是字母、数字、下划线。(2)变量名不能使用C#中的关键字(见表2-1)和库函数名称,如果一定要用C#语言中的关键字或库函数名称作为变量名,应使用“@”字符作为前缀。
(3)变量名严格区分字母大小写。合法变量名与不合法变量名举例:
inti; //合法
intno.1; //不合法,含有不允许的字符
stringname; //合法
charuse; //不合法,含有关键字
char@use; //合法
shortmain; //不合法,与main函数同名
_debug; //合法
关键字(KeyWords),又叫保留字,是C#编译器本身使用的特定符号串,每个关键字都有它的意义,程序设计者只能根据该意义加以使用,不能重新定义,因此变量名不能使用关键字,以免发生错误。C#语言的关键字如表2-1所示。表2-1C#中的关键字注意:●在给变量取名时尽量使用有意义的名称。●可以在一条语句中命名多个变量,例如:inta,b,c=5,d。●变量是区分大小写的,即大小写含义不同,如说明变量X和x是不同的,rose、Rose和ROSE是三个不同的变量。下面通过例2-1演示如何在C#程序中声明变量。
【例2-1】
建立一个控制台应用程序,在程序中声明变量,并将声明的变量输出。步骤:
(1)启动VisualStudio.NET,界面如图2-1所示。图2-1启动界面(2)单击【新建项目】按钮,打开“新建项目”对话框,项目类型选择“VisualC#”,模板选择“控制台应用程序”,名称填写“Demo2-1”,选择相应的存储位置。界面如图2-2所示。
(3)进入VS.NET控制台应用程序设计的主界面,如图2-3所示。图2-2新建项目图2-3控制台程序设计的主界面(4)在代码设计窗口中编辑class1.cs。在其中的Main(string[]args)函数体内写下列代码:
staticvoidMain(string[]args) { booltest=true; //声明布尔型
stringstr="Hello"; //声明字符串型
intnum=100; //声明整型
//输出各变量的值
Console.WriteLine("布尔型变量的值="+test); Console.WriteLine("字符串型变量的值="+str); Console.WriteLine("整型变量的值={0}",num); }(5)选择“调试”→“开始执行(不调试)”选项来执行此应用程序。
(6)程序运行结果如图2-4所示。图2-4例2-1运行结果2.变量的类型在C#语言中,把变量分为七种类型,它们分别是:静态变量、非静态变量、数组元素、值类型、引用参数、输出参数和局部变量,看下面的例子。
classA{publicstaticintx;inty;voidF(int[]v,inta,refintb,outintc){inti=1;c=a+b++;}}
在上面的变量声明中,x是静态变量,y是非静态变量,v[0]是数组元素,i是局部变量,a是值参数,b是引用参数,c是输出参数。1)静态变量带有static修饰符声明的变量称为静态变量。一旦静态变量所属的类被装载,直到包含该类的程序运行结束,它将一直存在。静态变量的初始值就是该变量类型的默认值。为了便于定义赋值检查,静态变量最好是在定义时赋值。如:
staticinta=10;
2)非静态变量不带有static修饰符声明的变量称为实例变量。如:
inta;针对类中的非静态变量而言,一旦一个类的新的实例被创建,直到该实例不再被应用从而所在空间被释放为止,该非静态变量将一直存在。同样鉴于定义赋值检查,一个类的非静态变量也应该在初始化时赋值。
结构中的非静态变量随着结构的存在而存在。也就是说,当一个结构类型的变量存在或结束时,该结构类型中的变量也随之存在和结束。同样的结构中的实例变量会随着结构类型变量的初始化而被初始化,如果该结构类型变量定义时未被赋值,那么其中的实例变量也不会被赋值。
3)数组元素数组元素也是变量的一种,该变量随该数组实例的存在而存在。每一个数组元素的初始值是该数组元素类型的默认值。同样鉴于定义赋值检查,数组元素最好在初始时被赋值。4)局部变量局部变量是指在一个独立的程序块、一个for语句、switch语句,或者using语句中声明的变量,它只在该范围中有效。当程序运行到这一范围时,该变量即开始生效,程序离开时变量就失效了。与其他几种变量类型不同的是,局部变量不会自动被初始化,所以也就没有默认值。在进行赋值检查的时候,局部变量被认为没有被赋值。在局部变量的有效范围内,在变量的定义以前就使用是不合法的,比如:
for(inti=0;i<10;i++){intnum=a; //非法,因为局部变量a还没有定义
inta;intb=a; //正确
}5)值参数当利用值向方法传递参数时,编译程序给实参的值做一份副本,并且将此副本传递给该方法。被调用的方法不会修改内存中实参的值,所以使用值传递时,可以保证实际值是安全的。在调用方法时,如果形式化参数的类型是值参数的话,调用的实参的表达式必须保证是正确的表达式。
6)引用参数和值参数不同的是,引用参数并不开辟新的内存区域。当利用引用参数向方法传递行参时,编译程序把实际值在内存中的地址传递给方法。7)输出参数与引用参数类似,输出参数也不开辟新的内存区域。与引用参数的差别在于,调用方法前需对变量进行初始化。输出参数用于传递方法返回的数据。
Out修饰符后跟随与形参的类型相同的类型声明。在方法返回后,传递的变量被认为经过了初始化。2.1.2C# 中的常量常量就是在程序执行中其值保持固定不变的量。常量通常可以分为直接常量和符号常量。从数据类型角度来看,常量的类型可以是任何一种值类型或引用类型。
直接常量是指把程序中不变的量直接编码为数值或字符串值。
(1)整数常量。
123 //int类型直接常量
32L //long类型直接常量
0x20 //十六进制的20(2)浮点常量。
//float类型直接常量
0.16d //double类型直接常量
(3)字符常量:用单引号括起的单个字符。‘A’ //字符直接常量
(4)字符串常量:用双引号括起来的零个或多个字符序列。
"Hello,World." //字符串直接常量(5)布尔常量。它只有两个值True和False。符号常量是经过声明的常量,包括常量的名称和它的值。常量声明的格式如下:
[访问修饰符]Const数据类型常量名=初始值;例如:
constdoublePI=3.1415926; publicconstfloatE=2.718;和变量一样,可以同时声明一个或多个给定类型的常量,例如:
constinta=1,b=2,c=3;
注意:符号常量必须在声明时赋初始值,一旦初始化,就不能修改了,否则会出现编译错误。【例2-2】计算钟摆周期。新建一个名为“Demo2-2”的控制台应用程序,将下列代码添加到Program.cs中:
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_2{classProgram{staticvoidMain(string[]args) { //PI常量PI constfloat_pi=3.14F; //由地球引力引起的加速度常量,单位为cm/s*s
constfloat_gravity=980; //钟摆的长度
intlength=40; //钟摆的周期
doubleperiod=0; //钟摆周期的计算公式
period=2*_pi*Math.Sqrt(length/_gravity); Console.WriteLine("钟摆的周期为{0}秒",period); } }}
说明:在计算钟摆周期公式中使用了两个常量:PI和地球引力引起的加速度(g),在程序中分别声明为_pi和_gravity,数据类型为float型。在示例中的程序用Math类的Sqrt()方法计算平方根。程序运行结果如图2-5所示。图2-5例2-2运行结果2.2C# 中数据类型的分类
C# 中的数据类型分为两种基本类型:值类型和引用类型。值类型指的是那些能够直接赋值的变量类型,引用类型则是函数或方法中定义的接口变量,用以访问内部数据。从面向对象的角度来考虑,引用类型支持数据的隐藏,而值类型不支持。数据类型的分类如图2-6所示。图2-6数据类型的分类2.2.1值类型
所谓值类型就是一个包含实际数据的量。值类型在栈中存储它的值,这与C++中的变量类似,当传递一个值类型的变量时,就是传递该变量的值而不是传递它的基础对象的引用。值类型包括基本类型、结构类型、枚举类型。1.基本类型基本类型有时也称为内置数据类型,是C#语言中提供的、无法再分解的一种具体类型。它可以分为:整数类型、字符类型、布尔类型和实数类型。
1)整数类型整数类型的变量的值为整数。在计算机语言提供的整数类型的值是在一定的范围之内。C#中整数类型有8种:字节型(sbyte)、无符号字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(ulong),具体各整数类型及其取值范围如表2-2所示。
2)实数类型
C#语言中实数类型包括单精度浮点型(float)、双精度浮点型(double)和十进制类型(decimal)。它们的差别主要在于取值范围和精度不同。具体各实数类型及其取值范围与精度如表2-3所示。表2-2整数类型及其取值范围数据类型别名特征取值范围示例sbyteSystem.sbyte8位有符号整型-128~127sbytesb=11;byteSystem.byte8位无符号整型0~255bytesb=11;shortS1616位有符号整型-32 768~32 767shortsb=1119ushortSystem.uint1616位无符号整型0~65535ushortsb=11;intS3232位有符号整型-2147483648~2147483647intsb=11;uintSystem.uint3232位无符号整型0~4294967295uintsb=510;longS6464位有符号整型-9223372036854775808~9223372036854775807longsb=102l;ulongSystem.uint6464位无符号整型0~18446744073709551615ulongsb=1025u表2-3实数类型及其取值范围3)字符类型
C#提供的字符类型按照国际上公认的标准,采用Unicode字符集。一个Unicode字符的长度为16位(bit),它可以用来表示世界上大部分的语言种类。可以按照下面的方式给字符变量赋值:
charch='H'; //Hcharcx='X'; //X
另外,还可以直接通过十六进制转义符(以\x开始)或Unicode表示法(以\u开始)给字符变量赋值,如:charch1='\x0048'; //Hcharcx1='\x0058'; //Xcharch2='\u0048'; //Hcharcx2='\u0058'; //X
另外,在C# 中,Java和C++等一样仍然存在转义符,用以在程序中指代特殊的控制字符,如表2-4所示。表2-4C#中常用的转义符2.枚举类型枚举(enum)实际上是为一组逻辑上密不可分的数值提供一个便于记忆的符号,该类型变量的值只限于列举出来的值的范围内。
3.结构类型在实际生活中,我们通常将相关的一些数据作为一个整体来处理。例如,一个学生的学号、性别、年龄和成绩等,我们需要把这些数据组合起来。在这个组合中可以包含若干个类型不同(也可以相同)的数据项(如学生、性别、年龄、成绩等)。在C#中实现这一功能的数据类型是结构类型,可以把一些变量作为结构类型数据的成员,它们统一于所组成的结构。2.2.2引用类型引用类型也称为参考类型。该类型变量不直接存储所包含的值。而是指向它所要存储的值。也就是说,引用类型所存储的实际数据是当前引用值的地址,因此引用类型变量的值会跟随所指向的值的变化而变化。这与简单数据类型是不同的:简单数据类型存储的是自身的值,而引用类型是将自身的值直接指向到某个对象的值,它就像一面镜子一样,虽然从镜子中看到了物体,但物体并不存在于镜子中,它只不过是将物体反射过来罢了。
C#中的引用类型主要有四种:类、委托、数组和接口。1.类类是面向对象编程的基本单位,是一种包含数据成员、数据函数和嵌套类型的数据结构。类的数据成员有常量、字段和事件。函数成员包括方法、属性、索引指示器、运算符、构造函数和析构函数。类支持继承机制,通过继承,派生类可以扩展类的数据成员和函数方法,进而达到代码重用和设计重用的目的。下面先来看看类的定义与使用,类需要使用class关键字进行声明,请看下面的例子。【例2-3】
类的定义与使用。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_3{classPerson{//类的成员
privatestringname;//类的属性
publicstringName{get{returnname;}set{name=value;}}//类的构造函数,即初始化函数,将类的成员初始化//如果构造函数有参数,则在引用该类时必须给出该参数的值,否则无法创建该类publicPerson(){name="test";}//类的方法
publicvoidClearValue(){name=null;}classUserPerson{//定义程序入口
publicstaticvoidMain(){Personp=newPerson(); //引用类
Console.WriteLine("1:"+p.Name);p.Name="Zhangsan"; //访问类的属性
Console.WriteLine("2:"+p.Name);p.ClearValue(); //访问类的方法
Console.WriteLine("3:"+p.Name);}}}}
说明:上面的程序定义了两个类:一个是Person,它包含数据成员name、属性Name、构造函数Person、方法ClearValue;另一个是UserPerson,这个类是为了检测类Person是否能正常工作而建立的,类中定义了Main方法,因此是可以执行的,该方法中引入了所声明的类Person,并对类的属性、方法进行访问。程序在运行过程中先由构造函数将name的值初始化为test,然后通过对属性Name的修改使其值为Zhangsan,最后使用ClearValue方法将name的值清除,因此,程序的运行结果如图2-7所示。图2-7例2-3运行结果2.委托委托(delegate)也称代表。它实际上相当于C#函数中的指针原型,与指针不同的是,委托是安全的,而使用指针的时候必须声明代码是“非安全的”。在声明委托时,只需要指定委托指向的原型类型即可。比如我们用下面的代码声明一个指向字符类型的函数原型的委托:
delegatestringTestDelegate();
如果我们声明了一个代表,那么它就是对系统定义的类System.delegate的一个扩展。在委托的实例中,可以封装一个静态方法,也可以封装非静态方法。关于委托的使用,我们来看看下面这个例子。【例2-4】
委托的使用。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_4{delegatestringMyDelegate(); //声明一个委托
publicclassMydg{//非静态方法声明
publicstringMydg_Normal(){return"非静态委托使用";}//static静态方法声明
publicstaticstringMydg_Static(){return"静态委托调用";}}publicclassUserPerson{//定义程序入口
publicstaticvoidMain(){Mydgdg=newMydg();//非静态方法调用MyDelegated=newMyDelegate(dg.Mydg_Normal);Console.WriteLine(d());//静态方法调用,只能用类名Mydg.Mydg_Static,不能写dg.Mydg_Staticd=newMyDelegate(Mydg.Mydg_Static);Console.WriteLine(d());}}}
程序运行结果如图2-8所示。图2-8例2-4运行结果3.数组数组是一种包含若干变量的数据结构,这些变量都可以通过索引进行访问。数组中包含的变量(又称数组的元素)具有相同的类型,该类型称为数组的元素类型。数组有一个“秩”,它表示和每个数组元素关联的索引的个数。数组的秩又称为数组的维度。“秩”为1的数组称为一维数组,“秩”大于1的数组称为多维数组。通常按维度大小确定的多维数组称为二维数组、三维数组等。
4.接口从技术上讲,接口是一组包含了函数型方法的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。2.2.3值类型和引用类型的区别值类型与引用类型的根本区别在于:值类型的变量包含自身的数据,而引用类型的变量包含的是指向包含数据的内存块的引用。对于值类型,每个变量都有一份自己的数据复制,因而,不能通过操作其中一个来影响另一个,而对于引用类型,两个变量有可能引用同一对象,因而,可以通过操作一个变量来影响另一个变量引用的对象。
【例2-5】
理解值类型与引用类型的区别。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_5{classValueclass{publicintvalue=0;}classValueandRefType{publicstaticvoidMain(){inta=0;intb=a;b=10;Valueclassref1=newValueclass();Valueclassref2=ref1;ref2.value=10;Console.WriteLine("Value:{0},{1}",a,b);Console.WriteLine("Refs:{0},{1}",ref1.value,ref2.value);}}}
程序运行结果如图2-9所示。图2-9例2-5运行结果
说明:
在Console.WriteLine格式中,其参数的个数是可变的,第1个参数是一个串,包含顺序符{0}、{1},{0}对应于第1个参数,{1}对应于第2个参数,在发送到Console输出之前,每个顺序符都要用对应参数的格式替换。
对局部变量a和b的初始化,局部变量b可重新赋值,其变量b的改变并不影响变量a的值,而每个值类型(int)的局部变量都有自己的存储域。而引用类型则不同,通过赋值ref2.value=10,则影响了ref1和ref2所引用的对象。2.3装 箱 和 拆 箱装箱是把值类型转换为引用类型(object类型),反之,拆箱则是将引用类型返回到值类型。利用装箱和拆箱功能,可通过允许值类型的任何值与Object类型的值相互转换,将值类型与引用类型链接起来。2.3.1装箱操作一个对象是指所需的一个对象。例如,System.Int32值类型,就在堆栈中为这个变量分配内存。可以把这个变量传递给任一方法的一个System.Object类型,并访问其可访问的任一成员。这看起来好像是一个对象,实际上,在堆栈中它仅是四字节的空间。
当试图以某种方式使用该变量时,该系统才自动地用System.Object类型接口将变量装箱,以便它变成一个引用类型,且可像任何对象一样使用。装箱使得任何事情看起来好像是一个对象,即装箱是一种让值类型看起来像引用类型的处理过程。因此,一切事情实际上是一个对象。简而言之,装箱是值类型转换成Object类型,是一个数值分配一个对象实例,并把这个数值复制到新对象中。例如:
intnum=1025; //值类型
objectobj=num; //num被装箱到obj
其中,第一行代码是创建一个int类型的变量num。int类型是一个值类型(因为它是一个基本类型)。在第二行,编译器看到该变量num,就把它复制到一个由变量obj表示的引用类型。然后,编译器将所需装箱的num值转换为MSIL代码。
总之,执行上述语句后,就在堆栈创建一个对象obj,该对象引用了堆栈上int类型的数值(此值是赋给变量num的数值的复制)。
【例2-6】
装箱的使用。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_6{publicclassbox{publicstaticvoidMain(){intnum=1025;objectobj=num;num=1119;Console.WriteLine("Resultofnumis:{0}",num);Console.WriteLine("Resultofobjis:{0}",obj);Console.WriteLine();}}}
程序运行结果如图2-10所示。图2-10例2-6运行结果2.3.2拆箱操作拆箱是将object类型转换为值类型,首先检查对象实例,确认它是给定值类型的包装实例,然后把实例中的值复制到值类型的实例中。现在,把obj转换回到值类型,可以进行一个显式的转换(强制类型转换):
intnum=1025 //值类型
objectobj=num; //num被装箱到obj intnum2=(int)obj; //拆箱返回到int
注意:当装箱时(当再一次从一个值类型转换为一个引用类型时),不需要显式地强制类型转换。然而,当拆箱时(从引用类型转换到值类型)则必须进行强制类型转换。这是由于在拆箱的情况下,一个对象可以强制转换到任何类型。因此,强制转换是必须的,以便编译器能够检验出该转型每次指定的变量类型是合法的。【例2-7】
拆箱的使用。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_7{publicclassBoxAndUnbox{publicstaticvoidMain(){intnum=1025;objectobj=num;intnum2=(int)obj;Console.WriteLine("Resultofnum2is:{0}",num2);Console.WriteLine();}}}
程序运行结果如图2-11所示。图2-11例2-7运行结果2.3.3实例1:身体质量指数计算问题:用一个称为“身体质量指数(BMI)”的量来计算与体重有关的健康问题的危险程度。BMI按下面的公式计算:其中,w是以千克为单位的体重,h是以米为单位的身高。BMI的值为20~25被认为是“正常的”,编写一个应用程序,输入体重和身高并输出BMI。分析:此问题可以定义w和h两个变量用来接收用户输入的体重和身高值,变量BMI用来存储计算的结果值,根据公式计算出结果并显示相应信息。BMI=
实现步骤:
(1)创建一个名为“lesson2Example1”的控制台应用程序。
(2)将class1.cs更名为BMI.cs。
(3)将以下代码添加到“BMI.cs”中。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceLesson_2_Example1{classBMI{staticvoidMain(string[]args){ floatw,h,BMI; //定义三个浮点型变量
Console.WriteLine("请输入体重的值(以千克为单位)"); w=float.Parse(Console.ReadLine());//将输入体重值进行类型转换并把值赋给w Console.WriteLine("请输入身高的值(以米为单位)"); h=float.Parse(Console.ReadLine()); //将输入的身高值赋给h BMI=w/(h*h); //计算BMI的值
Console.WriteLine("根据你输入的值计算出身体质量指数(BMI)为:{0}",BMI); }}}
程序运行结果如图2-12所示。图2-12实例1运行结果2.4C# 中的运算符与表达式
C#中表达式类似于数学运算中的表达式,是由运算符、操作对象和标点符号等连接而成的式子。在学习运算符时要注意运算符的两个重要特性:优先级和结合性。优先级规定了优先级高的运算先执行,优先级低的运算后执行,在相同优先级的情况下,结合性决定运算的顺序,左结合的从左往右算,右结合的从右往左算。2.4.1运算符的分类根据运算符作用的操作数个数来划分运算符的类型,C#中有三种类型的运算符:
(1)一元运算符。一元运算符作用于一个操作数,包括前缀运算符和后缀运算符。(2)二元运算符。二元运算符作用于两个操作数,使用时在操作数中间插入运算符。
(3)三元运算符。C#中仅有一个三元运算符“?:”,三元运算符作用于三个操作数,使用时在操作数中间插入运算符。下面是使用运算符的例子:
intx=5,y=10,z;x++; //后缀一元运算符
--x; //前缀一元运算符
z=x+y; //二元运算符
y=(X>10?0:1); //三元运算符下面通过表2-5了解各运算符的作用和用法。表2-5各运算符的作用与用法
注意:应用除法运算符“/”要注意,当参与运算的两个操作数都是整数,则运算结果也是整数,是这两个数作除法运算所得的商;当参加运算的两个操作数有一个是浮点数,则运算的结果也是浮点数,是这两个数作除法运算所得的结果。2.4.2关系运算符关系运算符:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、= =(等于)、!=(不等)、is运算符、as运算符,如表2-6所示。表2-6关系运算符的返回结果is运算符可以检查对象是否与特定的类型兼容:
inti=10; if(iisobject) { Console.WriteLine("iisanobject"); }int和从object继承而来的其他C#数据类型一样,表达式iisobject将得到true,并显示信息。
as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。如下面的代码所示,如果object引用不指向string实例,把object引用转换为string就会返回null。objecto1="SomeString"; objecto2=5; strings1=o1asstring;
//s1="SomeString" strings2=o2asstring;
//s1=nullas运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行转换。
【例2-8】
关系运算符“&&”与“||”的使用。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_8{classProgram{staticvoidMain(string[]args){intx=8;inty=12;Console.Write("请输入一个数:");//声明一个string类型的变量k用于用户输入
stringk;//读取用户输入
k=Console.ReadLine();//强制将string类型的变量k的值赋给int类型的变量z
intz=Convert.ToInt32(k);
//如果z>x并且z>=y则输出结果,这里用到与运算
if(z>x&&z>y)Console.WriteLine("经判断,这是最大数");//如果z<x或者z<=y则输出结果,这里用到或运算
if(z<x||z<y)Console.WriteLine("经判断,这不是最大数");}}}
程序运行结果如图2-13所示。图2-13例2-8运行结果【例2-9】?:运算符的应用。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_9{classProgram{staticvoidMain(string[]args)
{intx=8;inty=12;intz;
//使用条件运算符,如果x等于y,则输出1,否则输出0z=(x==y)?1:0;Console.WriteLine("结果为:{0}",z);}}}
程序运行结果如图2-14所示。图2-14例2-9运行结果2.4.3运算符的优先级在计算表达式时,每个运算符都会按顺序处理,但这并不意味着从左至右地运用这些运算符。例如,有下面的代码:
var1=var2+var3;
其中“+”运算符就是在“=”运算符之前进行计算的。在其他一些情况下,运算符的优先级并没有这么明显,例如:
var1=var2+var3*var4;
其中“*”运算符先计算,其后是“+”运算符,最后是“=”运算符,这是标准的数学顺序,其结果与我们在纸上进行算术运算的结果相同。
像这样的计算,可以使用括号控制运算符的优先级,例如:
var1=(var2+var3)*var4;
括号中的内容先计算,即“+”运算符在“*”运算符之前计算。对于前面介绍的运算符,其优先级如表2-7所示,优先级相同的运算符(如*和/)按照从左至右的顺序计算。表2-7C#运算符的优先级(从高到低)
说明:● %:整除取余。● &和 | 以及~和^:&和 | 执行按位与和按位或操作,而~和^执行按位非和按异或操作。对于^运算,只要它和两个操作数不同就返回True,否则返回False。● &&和||:执行布尔和布尔或操作,而!是布尔非运算符。对于&&运算,只有两个表达式同为True,表达式返回True,如果两个表达式有一个为False,则结果为False;如果左边表达式为False,表达式返回False,则右边表达式将不进行计算。对于||运算,如果两个操作数有一个或两个为True,则结果为True,如果两个操作数均为False,则表达式为False;如果左边表达式为True,表达式为True,则右边表达式将不进行计算。● <<和>>:执行整数类型的左位移和右位移。● ++和--:用于数值类型的增1和减1。该运算符可以放在变量之前,也可放在变量之后,如果放在变量之前(前置形式),则在表达式中使用它之前,改变变量的值;如果放在变量之后(后置形式),则在表达式使用该变量,然后改变它的值。● += 以及其他组合赋值运算符是缩写的,因而,a+=n意指a=a+n,a/=n意指a=a/n,其余类推。● ?:, 是三元条件运算,用于在两个可能的选择之间选择一个,取决于一个表达式的值是True还是False。例如,(x>5)?9:10,即如果x大于5,则结果为9,否则为10。注意:=用于赋值,而==用于测试相等。千万不要混淆。● new:用于在堆栈上创建对象,并调用构造函数。● sizeof:用于找出一个对象或类型的长度(以字节为单位),因此,sizeof(decimal)返回值16,因为decimal是16字节长。● is和typeof:用于在运行时被调用而获取某个类型的System.Type对象,形式为:typeof(类型)。其中,类型为要获取的System.Type的类型。● checked和unchecked:用于控制编译器处理算术计算的溢出条件。● as:用于在兼容类型之间进行转换。和强制转换有些相似,当转换失败时返回null。转换形式为:表达式as类型。【例2-10】求二次方程的解。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_10{classProgram{staticvoidMain(string[]args){//x2的系数
intcoefficient1=2;//x的系数
intcoefficient2=-7;//二次方程的常数值
intconstant=3;//存放表达式b2-4ac的值
doubleexpression=0;doublex1=0;doublex2=0;Console.WriteLine("二次方程为:{0}x2+{1}x+{2}",coefficient1,coefficient2,constant);expression=Math.Sqrt(coefficient2*coefficient2-(4*coefficient1*constant));x1=((-coefficient2)+expression)/(2*coefficient1);x2=((-coefficient2)-expression)/(2*coefficient1);Console.Write("x={0:F2}",x1);Console.Write("或");Console.WriteLine("x={0:F2}",x2);
}}}
程序运行结果如图2-15所示。图2-15例2-10运行结果2.5C# 中的选择语句当程序中需要进行两个或两个以上的选择时,可以根据条件来选择将要执行的一组语句。在C#中,实现该功能的语句有if语句和switch语句。2.5.1if语句
if语句是最常用的选择语句,它根据布尔表达式的值来判断是否执行后面的内嵌语句。一般来说,if语句有三种格式,这三种格式分别用于不同的情况。格式一:
if(表达式)语句1;
这种格式只需要判定某种条件是否成立,成立时才执行语句1,不成立时不作处理。例如:inta=3;intb=5;boolc=false;if(a= =b)c=true;
格式二:
if(表达式){
语句1}else{
语句2}
这种格式先判断条件是否成立。成立时执行语句1代码,不成立时执行语句2代码,这种格式适合两种可能的情况,用于对两种情况均需要处理的时候。例如:
inta=3;intb=5;boolc;if(a==b){c=true;}else{ c=false;}格式三:
if(表达式一){
语句1}elseif(表达式二){
语句2}else{
语句3}
这种情况适用于存在两种以上可能情况的时候,先判断表达式一是否成立,成立时执行语句1,否则判断表达式二,表达式二成立时执行语句2,表达式二不成立则执行语句3。若使用多重if语句嵌套,依此类推。可以使用条件运算符(?:)简化if条件语句,条件运算符取三个表达式为操作数组成条件运算表达式,它只能执行一个语句或者一个块,并取其结果作为表达式的值。其一般形式为:
表达式1?表达式2:表达式3
表达式1是一个返回True或False的布尔表达式,表达式计算为True时,条件运算符返回表达式2的值,若为False,则返回表达式3的值。
例如,条件语句:
if(a>=b) s=a*a; else s=b*b;
可简化为条件赋值语句:
s=(a>=b)?a*a:b*b;
表示若a>=b,则s等于a*a,否则为b*b。
【例2-11】
输入两个数,输出较大的数,两数相等时输出相应的提示信息。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_11{classProgram{staticvoidMain(string[]args){doublea,b,max;strings;Console.Write("Entervalueofa:");s=Console.ReadLine();a=double.Parse(s);Console.Write("Entervalueofb:");s=Console.ReadLine();b=double.Parse(s);if(a>b){max=a;Console.WriteLine("Themaxnumberis:{0}",max);}else{if(a==b){Console.WriteLine("aandbisequal,thevalueis{0}",a);}else{Console.WriteLine("Themaxnumberis:{0}",b);}}}}}
分别输入两个数,假设输入a的值为23,b的值为56,则程序运行结果如图2-16所示。图2-16例2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班长二三事议论文15篇范文
- 雨中的小故事记叙文14篇
- 我的老师与我写人的作文15篇范文
- 租赁设备的维护修理服务协议说明
- 体育活动表现荣誉证明书(5篇)
- 关于团队合作的议论议论文(4篇)
- 2025年保育员(五级)儿童教育哲学研究方法调查考试试卷
- 2025年脉冲反应堆及配套产品项目提案报告
- 2025年电梯安装维修人员实操考试试卷:案例分析与应用
- 2025年特产食品项目申请报告
- 2025年 汕头市公安局警务辅助人员招聘考试笔试试卷附答案
- 脑出血的护理查房
- 2025年大学思想政治理论课程考试试卷及答案
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
- 学习通《科研诚信与学术规范》课后及考试答案
- 百词斩雅思核心词汇
- PFMEA模板完整版文档
- 空心玻璃微珠项目资金申请报告写作模板+
- 药品管理学概论(药品管理学)
- 重复测量资料统计分析
- 广告机使用说明书模板
评论
0/150
提交评论