第4章 基本程序流程控制
本章主要介绍:位运算符、关系运算符、三元运算符及逻辑表达式;if语句、switch语句、break语句、default语句和goto语句的使用。
4.1 布尔逻辑
C#语言采用完全面向对象的程序设计方法,但一个应用程序通常包含了复杂的应用逻辑,要实现这些逻辑,必须进行程序的流程控制。程序的结构包含顺序、选择和循环三大基本结构。顺序结构是程序设计中最简单的基本结构,即程序语句从上到下依次执行,是系统默认的控制结构,不需要专门的语句来控制。如果程序中的一个问题出现两个或多个不同的处理,就需要根据具体情况进行解决。这时可以使用选择语句根据布尔条件表达式的值选择要执行的分支语句,从而实现流程控制。下面重点介绍选择结构。
4.1.1 位运算符
任何信息在计算机中都是以二进制的形式保存的。位操作符就是对数据按二进制位进行运算的操作符。C#语言中的位操作符有:& ——与;| ——或;^ ——异或;~ ——取补;<< ——左移;>> ——右移。取补只有一个操作数,而其他位操作符都有两个操作数。这些运算都不会产生溢出。位操作符的操作数为整型或者是可以转换为整型的任何其他类型。
(1)与运算
操作数按二进制位进行与运算,运算规则为:
0&0=0 0&1=0 1&0=0 1&1=1
说明除了两个位均为1,与运算结果为1。其他情况下,与运算结果均为0。比如,2和10进行与运算如下:
2的二进制表示: 00000010
10的二进制表示: 00001010
与运算的结果: 00000010
所以,2&10运算的结果为2。
(2)或运算
操作数按二进制位进行或运算,运算规则为:
0|0=0 0|1=1 1|0=1 1|1=1
说明除了两个位均为0,或运算结果为0。其他情况下,或运算结果均为1。比如,2和10进行或运算如下:
2的二进制表示: 00000010
10的二进制表示: 00001010
或运算的结果: 00001010
所以,2 | 10运算的结果为10。
(3)异或运算
操作数按二进制位进行异或运算,运算规则为:
0^0=0 0^1=0 1^0=1 1^1=0
说明当两个位相同时,异或运算结果为0,不相同时异或运算结果为1。比如,2和10进行异或运算如下:
2的二进制表示: 00000010
10的二进制表示: 00001010
异或运算的结果: 00001000
所以,2 ^ 10运算的结果为8。
(4)取补运算
取补运算对操作数的每一位取补,如对10取补结果为:
10的二进制表示: 00001010
取补运算的结果: 11110101
(5)移位运算
左移运算将操作数按位左移,高位被丢弃,低位顺序补0。比如,10的二进制为00001010,左移一位为00010100(20),左移两位为00101000(40)。
右移运算时,如果操作数x是int或long型时,x的低位被丢弃,其他各位顺序依次右移;如果x是非负数,最高位设成零;如果x为负数,则最高位设为1;而当x的类型为uint或ulong型时,x的低位将被丢弃,其他各位顺序依次右移,高位设为0。
【例4-1】右移运算符的使用。
using System; class Test { public static void Main()
{ int x=16; Console.WriteLine(x); int y=x>>2; Console.WriteLine(y); y=y>>2; Console.WriteLine(y); y=y>>2; Console.WriteLine(y); } }
程序运行的结果如图4-1所示。如果把x的初始值设为-16,则运行结果如图4-2所示。
图4-1 例4-1运行结果(一)
图4-2 例4-1运行结果(二)
4.1.2 关系运算
关系运算实际上是逻辑运算的一种,可以把它理解为一种“判断”,判断的结果要么是“真”,要么是“假”,也就是说,关系表达式的返回值总是布尔值。C#定义关系操作符的优先级低于算术操作符,高于赋值操作符。用关系操作符将两个表达式连接起来的式子就是关系表达式。关系表达式的值就是关系操作符的返回值,即一个布尔值。关系表达式可以再作为关系操作符的操作数,也可以作为布尔值赋给赋值表达式。
(1)比较运算
C#中定义的比较操作符有:== ——等于;!= ——不等于;< ——小于;> ——大于;<= ——小于或等于;>= ——大于或等于。
(2)is操作符
is操作符被用于动态地检查运行时对象类型是否和给定的类型兼容。例如,运算“e is T”,其中e是一个表达式,T是一个类型,返回值是一个布尔值,它表示:e是否能通过引用转换装箱转换或拆箱转换成功地转换于T类型。
【例4-2】is操作符的使用。
using System; class Test { public static void Main() { Console.WriteLine(1 is int); Console.WriteLine(1 is float); Console.WriteLine(1.0 is float); Console.WriteLine(1.0 is double);
} }
程序的运行结果如图4-3所示。
图4-3 例4-2运行结果
(3)as操作符
as操作符用于通过引用转换或装箱转换将一个值显式地转换成指定的引用类型。例如:
string s = someObject as string; if (s != null) { …… //someObject是字符串 }
4.1.3 逻辑表达式
C#语言提供了三种逻辑操作符:&& ——条件与;|| ——条件或;! ——逻辑非。条件与、条件或都是二元操作符,要求有两个操作数。而逻辑非为一元操作符,只有一个操作数。它们的操作数都是布尔类型的值或者表达式。操作数为不同的组合时,逻辑操作符的运算结果可以用逻辑运算的“真值表”来表示,如表4.1所示。
表4.1 逻辑运算真值表
技术要点
用逻辑操作符将关系表达式或布尔值连接起来就是逻辑表达式。逻辑表达式的值仍然是一个布尔值。如果表达式中同时存在着多个逻辑运算符,逻辑非的优先级最高,逻辑与的优先级高于逻辑或。
【例4-3】求解逻辑表达式的值。
using System; class Program { static void Main(string[] args) {
int a=3,b=4,c=5; Console.WriteLine(a + b > c && b == c); Console.WriteLine(a>b || b >c && b < c); Console.WriteLine(!(a > b) && !(b > c)); Console.ReadLine(); } }
程序说明:
① 在表达式“a + b > c && b == c”中,由于b == c不成立,故表达式值为false。
② 根据优先级次序,表达式“a>b || b >c && b < c”等价于“a>b || (b >c && b < c)”,由于b>c为false,所以b >c && b < c为false,又a>b为false,故表达式值为false。
③ 表达式“!(a > b) && !(b > c)”等价于“(!(a > b)) && (!(b > c))”,故表达式值为true。
程序的运行结果如图4-4所示。
图4-4 例4-3运行结果
4.2 分支
在程序设计中,程序流程的走向需要根据用户的指令或中间结果去选择执行不同的任务分支。C#语言提供了选择语句用于实现流程的改变,根据判断条件的真假来选择执行不同的分支。
4.2.1 if语句
选择结构,顾名思义,是指程序进入选择结构后,面临走哪一条路、执行哪一条分支的选择。选择是通过对某一个条件进行测试后做出的,条件往往由关系或逻辑表达式来描述。其程序流程图如图4-5所示,先进行条件判断,如果条件成立,执行程序段A,执行完后转向出口;如果条件不成立,则执行程序段B,执行完后转向出口。A、B两个程序段是处于平行的地位,不可能都被执行,只可能执行其中一路分支,然后就退出选择结构,转向共同的出口。当然在实际使用中,可能出现程序段B为空的情况,即条件不成立时什么也不做,只是跳过程序段A的执行。
图4-5 if语句的流程图
当程序中需要进行两个或两个以上的选择时,可以根据条件判断来选择将要执行的一组语句。C#提供的选择语句有if语句和switch语句。
if语句是最常用的选择语句,它根据布尔表达式的值来判断是否执行后面的内嵌语句。
if (boolean-expression) embedded-statement 或 if(boolean-expression)embedded-statement else embedded-statement
或 if(boolean-expression)embedded-statement else if (boolean-expression) embedded-statement
说明:当布尔表达式的值为真,执行if后面的内嵌语句embedded-statement;若为假,则程序继续执行。如果有else语句,执行else后面的内嵌语句,否则继续执行下一条语句。
下面的例子用来对一个浮点数x进行四舍五入,结果保存到一个整数i中。
if(x–int(x)>0.5) { i=int(x)+1; //当if后的表达式为真时执行 } else { i=int(x); //当if后的表达式为假时执行 }
如果if或else之后的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略,否则应对嵌套部分加上大括号。
如果程序的逻辑判断关系比较复杂,通常会采用条件判断嵌套语句。if语句可以嵌套使用,即在判断之中又有判断。具体形式如下:
if(boolean-expression) { if(boolean-expression) {……} else {……} } else { if(boolean-expression) {……} else {……} }
注意:每个else与离它最近且没有其他else与之对应的if相搭配。比如,语句
if(x) if(y) F(); else G();
实际上应该等价于下面的写法:
if(x) { if(y)
{ F(); } else { G(); } }
【例4-4】输入两个大于0的整数,分别计算两数的加、减、乘、除的结果并输出,小于0则不进行计算。
using System; class Program { static void Main(string[] args) { int a, b; string s1, s2; Console.Write ("a = "); s1=Console .ReadLine (); a = Convert.ToInt32(s1); Console.Write("b = "); s2 = Console.ReadLine(); b = Convert.ToInt32(s2); if (a > 0 && b > 0) { Console.WriteLine("{0}+{1} ={2} ", a, b, a + b); Console.WriteLine("{0}-{1} ={2} ", a, b, a - b); Console.WriteLine("{0}*{1} ={2} ", a, b, a * b); Console.WriteLine("{0}/{1} ={2} ", a, b, (float )a / b); } else { Console.WriteLine("输入的数不符合要求!"); } Console.Read(); } }
程序说明:主要注意if语句中的复合语句,第一个分支中包含四个语句,第二个分支中包含一个语句,则分别用一对大括号括起来形成复合语句,以保持各分支的整体性。
程序的运行结果如图4-6所示。
图4-6 例4-4运行结果
【例4-5】求分段函数的值。
设有一个数学函数的表达式为
则相应的程序流程如图4-7所示。
图4-7 例4-5程序流程图
源程序代码如下:
using System; class Program { static void Main(string[] args) { int x,y; string s; Console.Write("请输入X的值:"); s = Console.ReadLine(); x = Convert.ToInt32(s); if (x > 0) y = 1; else { if (x == 0) y = 0; else y = -1; } Console.WriteLine("函数Y的值为:{0}", y); Console.ReadLine(); } }
程序说明:
① 注意if语句的嵌套使用。if语句的嵌套不影响各if语句的独立性,应该注意单个语句的正确性和完整性。该例中的第一个分支中包含1个语句,第二个分支中又嵌套了一个if…else结构,第二个分支用一对大括号括起来形成复合语句,以保持分支的整体性。
② 程序由于x的取值有3种情况,也可以写成3个分支的形式。例如:
using System; class Program { static void Main(string[] args) { int x, y;
string s; Console.Write("请输入X的值:"); s = Console.ReadLine(); x = Convert.ToInt32(s); if (x > 0) y = 1; else if (x == 0) y = 0; else y = -1; Console.WriteLine("函数Y的值为:{0}", y); Console.ReadLine(); } }
程序的运行结果如图4-8所示。
图4-8 例4-5运行结果
4.2.2 三元运算符
三元操作符“?:”有时也称为条件操作符。其格式如下:
<表达式1> ? <表达式2> : <表达式3>
说明:根据<表达式1>进行判断,<表达式1>往往是表示条件的关系或逻辑表达式,当<表达式1>成立,其值为真时,将<表达式2>的值作为条件表达式的值返回;当<表达式1>不成立,其值为假时,将<表达式3>的值作为条件表达式的值返回。一个条件表达式从不会既计算x又计算y。条件操作符是向右关联的,也就是说,从左向右分组计算。例如,表达式“a ? b : c ? d : e”将按“a ? b: (c ? d : e)”形式执行。
“?:”的每个操作数必须是可以隐式转换成bool型的表达式或者是执行操作符true类型的表达式,如果上述这两个条件一个也不满足,则发生运行时错误。
“?:”的第二个和第三个操作数控制了条件表达式的类型。设x和y分别是第二个和第三个操作数的类型,那么:
⊙ 如果x和y为同一类型,则该类型即是条件表达式的类型。
⊙ 如果从x到y存在一个隐式转换但不存在y到x的转换,那么y是条件表达式的类型。
⊙ 如果从y到x存在一个隐式转换但不存在x到y的转换,那么x是条件表达式的类型。
⊙ 没有定义任何表达式类型,发生编译时错误。
条件表达式其实是对一个简单的if选择语句的浓缩,当if语句的两路分支均为一个赋值语句时,就可以用简单的条件表达式来代替if语句进行赋值。下例的功能是将变量a和b中的大值送到变量max中,if语句就可以缩写为条件表达式的形式。
if( a > b ) max = a; else max = b;
可改写为:
max = ( a > b ? a : b ) ;
如果是求三个变量中的最大值,用条件表达式表达的形式是:
max = ( a > b ? (a > c ? a : c) : (b > c ? b : c) ) ;
4.2.3 switch语句
if语句每次判断只能实现两条分支,如果要实现多种选择的功能,使用if语句实现往往比较复杂,那么可以采用switch语句方便地实现。switch语句根据一个控制表达式的值,选择一个内嵌语句分支来执行。switch语句的一般格式为:
switch(controlling-expression) { case constant-expression: embedded-statements break; case constant-expression: embedded-statements break; …… default: embedded-statements break; }
switch语句的控制类型,即其中控制表达式(controlling-expression)的数据类型可以是sbyte、byte、short、ushort、uint、long、ulong、char、string或枚举类型(enum-type)。每个case标签中的常量表达式必须属于或能隐式转换成控制类型。如果有两个或两个以上case标签中的常量表达式值相同,编译时将报错。switch语句中最多只能有一个default标签。
当switch语句执行时,其后的表达式首先是计算,然后将其结果与选择常量比较。如果其值与某个选择常量相等,执行该选择常量后的语句;如果表达式的值不与任何一个选择常量相匹配,则不执行任何switch语句。
在switch语句中也提供了一种类似于else的结构,即default语句。default语句是可选的,一个switch语句中可以没有default语句,也可以有一个default语句。如果没有任何一个选择常量与switch中的表达式的值相匹配,并且switch中存在着default语句,则执行default语句组。
【例4-6】从键盘输入一个年份和月份,计算该月的天数并输出结果。
using System; class Program { static void Main(string[] args) { int year, month,days;
string y, m; Console .WriteLine("year=?"); y = Console.ReadLine(); year = Convert.ToInt32(y); Console.WriteLine("month=?"); m= Console.ReadLine(); month = Convert.ToInt32(m); days = 0; switch (month) { case 1: days = 31; break; case 3: days = 31; break; case 5: days = 31; break; case 7: days = 31; break; case 8: days = 31; break; case 10: days = 31; break; case 12: days = 31; break; case 4: days = 30; break; case 6: days = 30; break; case 9: days = 30; break; case 11: days = 30; break; case 2: { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) days = 29; else days = 28; } break; } Console .WriteLine ("days={0}",days ); } }
程序说明:
① 由于一年有12个月,属于典型的多分支选择结构,因此程序中使用switch语句。
② C/C++语言允许switch语句中case标签后不出现break语句,但C#不允许这样,它要求每个标签项后使用break语句或跳转语句goto,即不允许从一个case自动遍历到其他case,否则编译时将报错。
③ 程序中对于2月份的处理采用了逻辑表达式的值直接进行计算,当某年为闰年时,表达式“(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)”的值为true,因此该年的2月份为29天,其余为28天。
④ 本例也可以使用条件语句来完成,如下:
using System; class Program { static void Main(string[] args) { int year, month,days;
string y, m; Console .WriteLine("year=?"); y = Console.ReadLine(); year = Convert.ToInt32(y); Console.WriteLine("month=?"); m= Console.ReadLine(); month = Convert.ToInt32(m); days = 0; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) days = 31; if (month == 4 || month == 6 || month == 9 || month == 11) days = 30; if (month == 2) if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) days = 29; else days = 28; Console .WriteLine ("days={0}",days ); } }
程序的运行结果如图4-9所示,即2008年2月有29天。
图4-9 例4-6运行结果
4.2.4 break语句
break语句用于停止语句的执行。即在switch语句结构中,break语句用于中断选择分支的语句运行,也可以使用goto语句实现语句的转移,但尽量避免使用这种方法。
在switch语句中,如果case语句后又有处理语句,需要使用break语句作为结束,如前面例题就是这种用法。另外,多个case语句也可以使用同一个处理语句。
【例4-7】用switch语句输出分数对应的等级制级别。任意输入一个百分制分数,输出该分数对应的等级制级别:90≤分数≤100,对应“优”;80≤分数<90,对应“良”;70≤分数<80,对应“中”;60≤分数<70,对应“及格”;分数<60,对应“不及格”;分数小于0或大于100,则输出“输入有误!”。
源程序代码如下:
using System; class Program
{ static void Main(string[] args) { int score, t; string s; Console.Write("请输入成绩:"); s = Console.ReadLine(); t = Convert.ToInt32(s); score = (int)(t / 10); if (t < 0 || t > 100) Console.Write("输入有误!"); else { switch (score) { case 0: case 1: case 2: case 3: case 4: case 5: Console.WriteLine("等级是:不及格"); break; case 6: Console.WriteLine("等级是:及格"); break; case 7: Console.WriteLine("等级是:中"); break; case 8: Console.WriteLine("等级是:良"); break; case 9: case 10: Console.WriteLine("等级是:优"); break; } } Console.Read(); } }
程序说明:
① 首先判断分数是否超过范围,只有在0~100之间再进行下一步处理,这样可以减少后面分支的数量。if语句之间、switch语句之间以及这两种选择语句之间可以相互嵌套,此例中的switch语句则被包含在if语句的else分支中。
② 由于要将分数分若干级别,为减少分支的数量,先对分数进行处理,将其整除10后取整,则得到分数的十位数并保存到变量score中,以此定位分数所在的分数段,对应不同的等级。
③ 程序中前5个case语句为空,在第6个case语句中使用处理语句,在这种情况下,前5个case语句都使用第6个case的处理语句。同样地,后两个case语句也使用同一个处理语句。
程序的运行结果如图4-10所示。
图4-10 例4-7运行结果
4.2.5 default语句
在switch语句中,常常使用default语句来处理不满足case语句的值,定义default语句可以增强处理相应的异常。
下面将例4-7的程序代码略作修改,以描述default语句的用法。
源程序代码如下:
using System; class Program { static void Main(string[]args) { int score,t; string s; Console.Write("请输入成绩:"); s=Console.ReadLine(); t=Convert.ToInt32(s); score=(int)(t/10); if(t<0||t>100) Console.Write("输入有误!"); else { switch(score) { case 10: case 9: Console.WriteLine("等级是:优"); break; case 8: Console.WriteLine("等级是:良"); break; case 7: Console.WriteLine("等级是:中"); break; case 6: Console.WriteLine("等级是:及格"); break; default: Console.WriteLine("等级是:不及格"); break; } } Console.Read(); } }
程序说明:default语句表示score不等于6~10时要执行的分支,其实只剩下分数小于60分的情况,输出等级为“不及格”。
4.3 goto语句
goto语句即转移控制语句,可用来跳出循环和switch语句。它无条件地转移程序的执行控制,其转移目的地是一标号,因此,要求标号与goto语句处在同一函数中。
goto语句的语法格式有以下3种:
goto 标号; goto case表达式; goto default;
“标号”是指源程序中某一特定的位置,当程序中执行到无条件转向语句goto时,将根据goto语句中指定的标号转向相应的程序位置继续执行程序。当源程序通过编译、连接形成可执行文件并运行程序时,标号相应地被转换为计算机内存储器中的单元地址。
标号的命名规则与变量名相同,即由字母或下划线开头,其后可以使用字母、数字和下划线。在程序中定义标号时,应在标号名称后加上冒号“:”。
【例4-8】goto语句的简单应用。
using System; class Program { static void Main(string[] args) { goto h; w:Console .WriteLine ("world!"); return ; h:Console .Write ("hello "); goto w; } }
程序的运行结果如图4-11所示。
图4-11 例4-8运行结果
4.4 小结
本章主要介绍了C#语言中的基本程序流程控制技术,包括布尔逻辑运算符和表达式的相关知识,还介绍了if语句、break语句、switch语句、default语句和goto语句的使用。通过本章的学习,学生应掌握选择结构的使用方法和技巧。
课外阅读──default语句的其他用法
default关键字可在switch语句或泛型代码中使用:如果用在switch语句中,指定默认标签;如果用在泛型代码中,指定类型参数的默认值,对于引用类型为null,对于值类型为0。
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。“泛型类型参数”称“类型参数”,是泛型类型或方法定义中的占位符。例如,Dictionary<(Of <(TKey,TValue>)>)类,泛型类型具有两个类型参数:TKey和TValue,分别表示其键和值的类型。
.NET Framework 2.0版类库提供了新的命名空间System.Collections.Generic,其中包括几个随时可用的泛型集合类和关联接口。其他命名空间(如System)也提供新的泛型接口,如IComparable<(Of <(T>)>)。与早期版本的.NET Framework所提供的非泛型集合类相比,这些类和接口更高效、安全。在设计和实现自己的自定义集合类之前,请考虑是否能够使用 .NET Framework类库所提供的类,或者是否能从 .NET Framework类库所提供的类派生一个类。
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型T,即T是引用类型还是值类型;如果T为值类型,则它是数值还是结构。
给定参数化类型T的一个变量t,只有当T为引用类型时,语句t = null才有效;只有当T为数值类型而不是结构时,语句t = 0才能正常使用。解决方案是使用default关键字,此关键字对于引用类型会返回null,对于数值类型会返回0。对于结构,此关键字将返回初始化为0或null的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自GenericList<T>类的示例显示了如何使用default关键字。
public class GenericList<T> { private class Node { //... public Node Next; public T Data; } private Node head; //... public T GetNext() { T temp = default(T); Node current = head; if (current != null) { temp = current.Data; current = current.Next; } return temp; } }
练习 4
一、选择题
1.下列语句中,____语句属于C#的条件选择语句。
A.if
B.break
C.do
D.using
2.在以下运算符中,运算优先级最高的是____。
A.++
B.<<
C.+
D.||
3.下列运算符不属于逻辑运算符的是____。
A.!
B.&&
C.||
D.!=
4.在if分支结构中,条件表达式的值必须是____类型的数据。
A.数值型
B.字符型
C.逻辑型
D.字符串型
5.在C#选择结构中,通过____命令来退出switch分支结构。
A.continue
B.break
C.goto
D.return
6.在C#表达式中,可以使用____符号来改变表达式的运算顺序。
A.[ ]
B.( )
C.{ }
D." "
7.在C#源程序代码中,使用____符号表示块语句。
A.[ ]
B.( )
C.{ }
D." "
8.C#关系运算表达式和逻辑运算表达式的结果一定是____结果。
A.数值型
B.日期型
C.逻辑型
D.关系型
9.有条件赋值语句“s = (a>b) ? a*a: b*b;”,若a>b,则s等于____。
A.a*a
B.b*b
C.a
D.b
10.下列说法中,不正确的是____。
A.赋值表达式通过赋值运算符将表达式的运算结果赋予赋值运算符左边的变量名
B.在计算表达式时,任何表达式必须从左到右依次计算
C.在C#语言中,“>>”运算符表示右移运算符
D.C#运算符优先级总的来说,一元运算符的优先级高于二元和三元运算符
二、填空题
11.表达式“4 * 10 >= 65”的值为____。
12.计算表达式“10 == 10 && 10 > 4 + 3”的结果为____。
13.计算表达式“10 * 10 * 10 > 10 || 2< 2 + 3”的结果为____。
14.以下程序运行后输出的结果是____。
static void Main(string[] args) { int a = 1, b = 2, c = 3; if (c == a) Console.WriteLine(c); else Console.WriteLine(b); Console.Read(); }
15.将命题“a是小于正整数b的偶数”用C#表达式可以表示为____。
16.以下程序运行后输出的结果是____。
static void Main(string[] args) { int x=2,y=3; x+=y; Console.WriteLine(x); x -= y; Console.WriteLine(x); Console.Read(); }
17.以下程序运行后输出的结果是____。
static void Main(string[] args) { char ch='w'; int i = 1, j = 2; Console.WriteLine('a'+i-j<ch); Console.Read(); }
18.以下程序运行后输出的结果是____。
static void Main(string[] args) { int i = 1, j = 2,k=3; i += j += k; Console.WriteLine(i<j?j:i); Console.Read(); }
19.以下程序运行时,从键盘输入6,则输出结果为____。
static void Main(string[] args) { Console.Write("输入数字:"); string s = Console.ReadLine(); int num=int.Parse(s); //将字符串转换为等效的32位有符号整数 if (num++> 5) Console.WriteLine(num); else Console.WriteLine(-num); Console.Read(); }
20.以下程序运行后输出的结果是____。
static void Main(string[] args) { int i = 0, j = 1; switch (i) { case 0: Console.WriteLine("i=0"); switch (j) { case 0: Console.WriteLine("j=0"); break; case 1: Console.WriteLine("j=1"); break; }
break; } Console.Read(); }
三、编程题
21.从键盘输入三角形的三边长,求其面积;若三边长不能构成三角形,则提示输入错误。
22.编程计算以下分段函数的值:
23.从键盘任意输入三个数,求其中最大的数。
24.从键盘任意输入一个整数,判断是否为“正整数”、“0”或“负整数”。
25.从键盘任意输入一个整数,判断是偶数还是奇数,并输出结果。
26.学校将对学习成绩优良的学生进行奖励,凡满足以下条件之一即可获奖:
(1)5门课程的总分大于或等于450分。
(2)前3门(主课)课程的成绩都在95分以上(含95分),其余2门课程的成绩都在80分以上(含80分)。
(3)每门课程的成绩均大于或等于88分。
编写程序,输入某学生的5门课程成绩,判断他是否能够获奖。