第 3 章 结构化程序设计
程序设计语言是由语句构成的,只有很好地掌握程序设计的各种基本语句,才
能编写正确的程序。本章主要说明结构化程序设计的三种基本结构形式和基本程序
流程控制语句。基本结构分别为顺序结构、选择(分支)结构和循环结构。通过对
本章的学习,读者应该掌握以下主要内容:
条件语句的语法与使用
各种循环语句的特点与使用方法
跳转语句的使用
程序语句一般都是按照语句书写的顺序执行,但实际上在编写程序时会根据一定的条件
来执行不同的程序语句段,这就需要有相关的控制语句来控制程序的流程。这种改变语句流
程的语句叫控制语句。在 C#中控制程序结构的语句包括选择语句、循环语句和跳转语句。
3.1 选择语句
使用选择结构语句块中的条件表达式可以控制程序中哪些语句被执行,以及按什么样的
次序执行。在 C#中选择语句又可分为两种:一种是 if 语句,主要用于分支比较少的情况;
另一种是 switch 语句,主要用于多分支的情况。
3.1.1 if 语句
if 条件分支语句的语法格式如下:
if (布尔表达式) 语句 1 ; else 语句 2;if 语句首先判断布尔表达式的值是真还是假,如果表达式的值为真,就执行语句 1,然
后跳出 if 语句,继续执行 if 语句后面的语句;如果表达式的值为假,就执行 else 后面的语
句 2。这种分支语句称为双分支语句,其控制流程如图 3-1(a)所示。
if 语句中的关键字 else 和语句 2 可以省略,这时 if 语句的语法格式为:
if (布尔表达式) 语句 1;在这种情况下,如果布尔表达式的值为真,就执行语句 1;否则就跳过语句 1,执行 if
语句后面的语句,这种分支语句称为单分支语句,其控制流程如图 3-2(b)所示。
39 第 3 章 结构化程序设计 (a) (b) 图 3-1 if 语句控制流程图
程序代码 3-1 从键盘输入一个字符,程序检查输入字符是否为字母。如果输入的字符是
字母,则程序检查是大写还是小写,并给出相应的信息。
程度代码 3-1 判断输入的是大写字母还是小写字母
using System; namespace P3_1 { class Program {static void Main(string[] args) { Console.Write("请输入一个字母:"); char c = (char)Console.Read(); if (Char.IsLetter(c)) //判断用户输入的是否是字母 { if (Char.IsLower(c)) //判断用户输入的是否是小写字母 { Console.WriteLine("您输入的是小写字母!"); } else { Console.WriteLine("您输入的是大写字母!"); } } else { Console.WriteLine("您输入的不是字母!"); } Console.ReadLine(); } } }
程序代码 3-1 的运行示例 1:
请输入一个字母:A 您输入的是大写字母! 真 假 真 假 语句块 1 语句块 2 布尔表达式 语句块 1 布尔表达式40 C#程序设计
程序代码 3-1 的运行示例 2:
请输入一个字母:a 您输入的是小写字母!程序代码 3-1 的运行示例 3:
请输入一个字母:9 您输入的不是字母!程序代码 3-1 中的 Char.IsLetter(c)是判断字符变量 c 是否为字母,如果是字母返回值是
true,否则返回 false;Char.IsLetter(c)是一个函数,返回字符变量 c 的大小写属性,如果变量
c 存储的是小写字母,则返回值是 true,否则是 false。
另外,if 语句还可以进行扩展,使用下列 else-if 排列来处理多个条件,其流程图如 3-2
所示。
if (布尔表达式 1) { //语句 1; } else if (布尔表达式 2) { //语句 2; } else if (布尔表达式 3) { //语句 3; } else { //语句 4; } 图 3-2 扩展 if 语句程序代码 3-2 完成的功能与程序代码 3-1 相同,同样是判断输入的字符是小写字符、大
写字符还是数字,并给出相应的提示。
程序代码 3-2 判断输入的是大写字母、小写字母还是数字
using System; namespace P3_2 假 真 假 布尔表达式 3 语句块 3 语句块 4 真 假 布尔表达式 2 语句块 2 真 布尔表达式 1 语句块 141
第 3 章 结构化程序设计 {
class Program {
static void Main(string[] args) { Console.Write("请输入一个字母:"); char c = (char)Console.Read(); if (Char.IsUpper(c)) { Console.WriteLine("输入的是大写字母."); } else if (Char.IsLower(c)) { Console.WriteLine("输入的是小写字母."); } else if (Char.IsDigit(c)) { Console.WriteLine("输入的是数字."); } else { Console.WriteLine("输入的既不是数字也不是字母."); } Console.ReadLine(); } } }
在 if 语句中的布尔表达式可以由多个表达式组成,这些表达式可使用与(&&)、或
(||)、非(!)进行连接。例如,在下列 if 语句中,若 Score 的值大于等于 60 且小于等于
100,那么让字符串变量 str1 设为“你通过测试!”
,其语句如下:
if (Score>= 60) && (Score<=100){ str1 = "你通过测试!"; }
另外,C#有一个三元运算符(?:)是 if…else 语句的省略形式,当需要进行比较并返回
一个布尔值时,该运算符是很有用处的。例如:
int Number=80; string str1; str1 = (Number>=60)?"通过":"下次再来"; //str1="通过"3.1.2 switch 语句
使程序实现多条选择路径的另一种方法是使用 switch 语句,也叫开关语句,此语句根据
一个表达式的多个可能取值来选择要执行的代码段。其格式形如:
switch (控制表达式){ case 常量表达式 1: 语句 1; break; case 常量表达式 2: 语句 2; break; ……42 C#程序设计 default: 语句; break; }
其中,控制表达式的类型可以是整数类型(包括枚举类型和字符类型)和字符串类型,
而各个 case 标签后的常量表达式的类型必须与控制表达式的类型相同,或者能够隐式地转换
为控制表达式的类型。
switch 语句的形式是以 switch 表达式开始,后跟一连串的 switch 块,每个 switch 块通过
case 来标记。在执行过程中,程序将控制表达式的值与常量表达式 1 和常量表达式 2 等依次
进行比较,如果相等则执行对应 case 标签下的语句,然后执行 break 语句来结束 switch 语
句。如果控制表达式的值与所有常量表达式的值均不匹配,则执行 default 标签后的程序
段,default 部分是可选的,即在 switch 语句中可以不出现。
需要强调说明的是,在每个 switch 块结束处必须使用 break 语句,否则就会产生编译错
误,因为编译器不允许连续执行多个 switch 块。
程序代码 3-3 是当用户输入一个百分制的学生成绩时,根据所输入的数值程序能自动显
示该成绩对应的优、良、中、及格和不及格。
程序代码 3-3 switch 实例 1
using System; namespace P3_3 { class Program {static void Main(string[] args) { Console.WriteLine("请输入分数:"); int x; if (!int.TryParse(Console.ReadLine(), out x)) //判断用户输入的是否是数字 { Console.WriteLine("输入的不是数字!"); } else { switch (x/10) { case 10: Console.WriteLine("优秀"); break; case 9: Console.WriteLine("优秀"); break; case 8: Console.WriteLine("良好"); break; case 7: Console.WriteLine("中"); break; case 6:
43 第 3 章 结构化程序设计 Console.WriteLine("及格"); break; default: // 6 分以下均不及格 Console.WriteLine("不及格"); break; } } } } }
程序代码 3-3 中使用 int.TryParse()方法把用户输入的字符转换为整数类型,如果转换成
功则返回 true,否则返回 false。该方法的最后一个参数为输出值,如果转换失败,则输出值
为 0。
程序代码 3-3 中首先把用户输入的数字字符转换为相应的整数,该整数的范围应该是在
0~100 之间,然后把该数除以 10,这样做的目的是取成绩变量值中的十位数字,这样可以根
据所得到的十位数字的值来确定该数的级别,在此例中输入 0~100 之内的数字都会得到正确
的等级,但是输入 100 以外的数字,按照该例程序的运行结果将会显示“不及格”,例如输
入 120,这样变量 x 的值就是 120,进行 x/10 运算之后得到的值是 12,这样执行 switch 语句
的 default 块,就会显示“不及格”。
程序代码 3-4 可以用来解决上面所提到的程序错误问题,它主要是为了说明空 case 标签
可以从一个 case 标签贯穿到另一个 case 标签。
程序代码 3-4 switch 实例 2
using System; namespace P3_4 { class Program {static void Main(string[] args) { Console.WriteLine("请输入分数:"); int x; if (!int.TryParse(Console.ReadLine(), out x)) { Console.WriteLine("输入的不是数字!"+x); } else { switch (x/10) { case 10: case 9: Console.WriteLine("优秀"); break; case 8: Console.WriteLine("良好"); break; case 7:
44 C#程序设计 Console.WriteLine("中"); break; case 6: Console.WriteLine("及格"); break; case 5: case 4: case 3: case 2: case 1: case 0: Console.WriteLine("不及格"); break; default: Console.WriteLine("您输入的分数不在 0~100 之间,不能进行等级转换"); break; } } } } }
3.2 循环语句
循环语句用于在一定条件下多次重复执行一组语句。可以根据下列条件重复执行语句:
直到条件为真时、直到条件为假时、指定的次数、集合中的每个对象执行一次。C#支持的循
环结构包括 for 语句、foreach 语句、while 语句、do...while 语句。
3.2.1 while 语句
当循环体的执行次数不确定时,可使用 while 语句,具体执行次数取决于条件表达式的
值。只要条件为 true,则重复执行语句块。while 语句在开始循环体前先检查该条件表达式
的值,再执行循环体,因此 while 循环的执行次数可能是零次或多次,其程序流程如图 3-3
所示,语法结构形式如下所示:
while(表达式) { 语句块; }其中:
表达式:可隐式转换为 bool 或包含重载 true 和 false 运算符的类型。此表达式
用于测试循环终止条件。
语句块:要执行的嵌入语句。
while 语句的执行顺序是:
①计算逻辑表达式的值;
45 第 3 章 结构化程序设计
③ 若逻辑表达式的值为真(true),则执行循环体语句(循环体语句应包括对循环条件
的修改),循环体语句执行完转移至①;
④ 循环语句执行完毕。
需要说明的是 while 循环语句结尾是没有分号“;”的,加上分号程序会出错,C#规定一
个语句块(用大括号括起来的语句)结尾不加分号“;”。另外逻辑表达式不能为空,否则会
出错。
如果一个循环是“while ( true ) { … … }”,按 while 语句执行规则(如果循环体中没
有另外的出口),则无法结束程序,进入死循环。这不是程序设计人员开发应用程序的目
的。所以要避免死循环的出现,就要对循环语句的循环条件进行有效控制,满足实际的循环
需求。
程序代码 3-5 利用 while 语句实现 100 以内的数字累加,其程序流程如图 3-4 所示。
图 3-3 while 循环的流程图 图 3-4 while 语句实现 1~100 累加的程序流程图程序代码 3-5 while 语句实现 100 以内的数字累加
using System; namespace P3-5 { class Program {static void Main(string[] args) { int count,sum; count = 1; sum = 0; //累加和变量初值清 0 while (count <= 100) { sum += count ; count++; } Console.WriteLine("1 到 100 的累加和是:{0}",sum); Console.ReadLine(); 假 语句块 结束循环,执行 下面的语句 假 真 count=1 sum=0 sum=sum+count count=count+1 真 表达式 输出累加和 count≤100
46 C#程序设计 } } }
说明:
(1)循环体如果包含一个以上的语句,应该用大括号括起来,以复合语句的形式出
现。如果不加大括号,则 while 语句的控制范围仅限于 while 后紧跟的第一条语句。例如,
下列语句执行完成后,count 和 sum 的值分别为多少?
count = 1; sum = 0; while (count <= 100) count++; sum += count ;由于 while 语句没加大括号,所以 while 语句的范围只到 while 后面的第一条语句,这样
上面语句段执行结束后,count 变量的值是 101,sum 变量的值是 101。
(2)在循环体中应有修改控制循环结束变量值的语句,以使循环结束。例如,在程序
代码 3-5 中循环结束的条件是“count<=100”,因此在循环体中每执行一次循环体都要修改
count 变量的值,使变量 count 的值不断增加(本例中使用“count++”语句)
,使变量 count
的值不断逼近 100,直到结束循环语句的条件。如果无此语句,则 count 的值始终不改变,
这样就会造成循环体变成死循环,例如下面的语句:
count = 1; sum = 0; while (count <= 100) { sum += count ; }3.2.2 do…while 语句
当事先不知道需要执行多少次循环体时,可使用 do…while 语句,执行的具体次数取决
于条件表达式的值,可以在条件表达式为 true 时一直重复执行循环语句。它与while语句的
区别是:
(1)while 语句是先判断循环结束条件,再执行循环体。也就是说循环体的执行次数
可能是零次或者多次。
(2)do 语句是先执行循环体,后判断循环结束条件,也就是说循环体至少被执行一次。
do…while 语句语法结构如下所示:
do{ 循环体语句; } while (逻辑表达式);do…while 语句执行规则如下:
① 执行循环体语句(在进入循环体语句之前应有对循环的初始化,循环体内应有对循
环条件的修改);
② 计算循环判断逻辑表达式的值;
47 第 3 章 结构化程序设计
③ 若循环判断逻辑表达式的值为假(fasle)则转移至④,若逻辑表达式的值为真 true
转移至①;
④ 循环语句执行完毕。
要注意的是,do…while 语句结尾有分号“;”,因为结尾不是循环体。如果没有分号程
序会出错,C#规定一条语句以分号“;”结束。
如果一个循环是“do{ … … } while ( true );”,按 do…while 语句执行规则(如果循环
体中没有另外的出口),则无法结束程序,和 while 循环一样进入死循环。一个完整的
do…while 语句程序也应有初始化、循环判断、循环条件修改。
其中,逻辑表达式是用于测试循环终止条件;而循环语句块是要执行的循环体。
do…while 语句流程图如 3-5 所示。
图 3-5 do…while 语句流程图程序代码 3-6 利用 do…while 语句实现 100 以内的数字累加,其程序流程如图 3-6
所示。
代码 3-6 do…while 语句实现 100 以内的数字累加
using System; namespace P3-6 { class Program {static void Main(string[] args) { int count,sum; count = 1; sum = 0; do { sum += count; count++; } while (count <= 100); Console.WriteLine("1 到 100 的累加和是:{0}",sum); 假 循环体语句 结束循环,执行 下面的语句 真 表达式
48 C#程序设计 Console.ReadLine(); } } } 图 3-6 do…while 语句实现 100 以内的数字累加的程序流程图
3.2.3 for 语句
for 循环语句适合用在已知循环次数的情况下,其控制流程如图 3-7 所示。
图 3-7 for 语句控制流程图for 循环语句的语法格式如下:
假 真 count=1 sum=0 输出累加和 count≤100 sum=sum+count count=count+1 假 初始化 真 循环体语句 循环体条件修改 结束循环,执行 下面的语句 表达式49 第 3 章 结构化程序设计 for ([初始化];[循环判断];[循环条件修改]) { //for 循环语句循环体 }
for 语句执行规则:
① 执行初始化项(只执行一次);
② 计算循环判断逻辑表达式项的逻辑表达式的值;
③ 若循环判断逻辑表达式的值为假(false)则转移至⑥;
④ 若循环判断逻辑表达式的值为真(true),则执行 for 循环的循环体语句(循环体语
句一般不包含循环条件的修改)
;
⑤ 执行循环条件修改项,进行循环条件的修改,循环条件修改执行完转至②;
⑥ 若逻辑表达式的值为假(false),则循环语句执行结束。
程序代码 3-7 利用 for 语句实现 100 以内的数字累加。
程序代码 3-7 for 语句实现 100 以内的数字累加
using System; namespace P3-7 { class Program {static void Main(string[] args) {
int count,sum; sum = 0;
for (count = 1; count <= 100;count++ ) sum += count; Console.WriteLine("1 到 100 的累加和是:{0}",sum); Console.ReadLine(); } } }
for 语句嵌套时可以实现多层循环,以完成大量重复性的工作。
程序代码 3-8 打印出斐波纳契(Fibonacci)数列的前 20 项。斐波纳契数列源于古典的
数学问题,理论上指数列的前两项都为 1,从第三项开始,数列的每一项为前两项之和,
如:1 1 2 3 5 8 13 21 34 55 89 ……
可以先声明两个整形变量:f1 和 f2,初始化 f1 = 1,f2 = 1。
先输出 f1,f2,再使用公式:
f1 = f1 + f2 f2 = f2 + f1;再输出 f1,f2,再使用公式:
f1 = f1 + f2 // 循环体 f2 = f2 + f1; ……直到输出第 40 项。
程序代码 3-8 斐波纳契(Fibonacci)数列的前 20 项
using System;50 C#程序设计
namespace P3_8 {
class Program {
static void Main(string[] args) {
int i , f1 = 1, f2 = 1;
for (i=1; i <= 10; i++) //定义并初始化三个变量 { Console.Write("{0} {1} ", f1, f2); //输出 f1,f2 if (i % 2 == 0) Console.WriteLine(); //控制每输出四个数据项换行一次 f1 = f1 + f2; //计算 f1 f2 = f2 + f1; //计算 f2 } Console.ReadLine(); } } }
程序执行后输出如图 3-8 所示。
图 3-8 程序代码 3-8 的执行结果程序代码 3-9 通过双重循环来实现输出三角形。此程序由用户先输入所需要显示的三角
形的行数,然后根据输入值显示相应行数的三角形。其程序思想是:外循环控制所输出的三
角形的行数;内循环是两个,前面一个内循环输出规定的空格数,后面一个内循环输出指定
的“*”个数。
程序代码 3-9 输出三角形
using System; namespace P3_9 { class Program {static void Main(string[] args) {
Console.Write("请输入行数:");
int lines = int.Parse(Console.ReadLine()); Console.WriteLine("");
for (int i = 1; i <= lines; i++) {
for (int k = 1; k <= lines - i; k++) Console.Write(" "); for (int j = 1; j <= i * 2 - 1; j++) Console.Write("*");
51 第 3 章 结构化程序设计 Console.WriteLine(""); } Console.ReadLine(); } } }
程序执行后输出如图 3-9 所示。
图 3-9 程序代码 3-9 的执行结果也可根据程序代码 3-9 来实现倒三角形的显示。
3.2.4 foreach 语句
foreach 循环语句用于对数组、字符串及集合类型实例中的每一个元素进行只读访问。
foreach 语句用于循环访问集合以获取信息,但不用于更改集合内容。foreach 循环语句的语
法形式如下:
foreach (迭代类型 迭代变量名 in 集合) { //foreach 语句循环体 }其中:
迭代类型不是一种新数据类型,而是 C#数据类型之一,可以定义迭代变量,从集
合中重复、交替地取元素,将元素的值传递给迭代变量。
集合是指实现 System.Collections.IEnumerable 接口的类的实例对象,包括.NET 框架
System.Collection 中的集合类的实例对象、数组、字符串等的实例对象。
foreach 循环语句的运行过程如下:每一次循环时,从集合中取出一个新的元素值,放
到迭代变量中去,括号中的整个表达式的返回值为 true,然后执行循环体;如果集合中的元
素都已经被访问过,foreach 括号中的整个表达式的值为 false,控制流程就转入到 foreach 语
句块后面的第一条可执行语句。下面通过程序代码 3-10 说明 foreach 循环的使用方法,程序
代码的功能是根据用户输入的数据,统计出其中大写字母和小写字母的个数。
程序代码 3-10 foreach 循环的使用方法
using System; namespace P3_10 { class Program {static void Main(string[] args) {
52 C#程序设计
string text = Console.ReadLine(); int COUNT = 0;
foreach (char ch in text) {
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') COUNT ++; } Console.WriteLine("字符共出现{0}次", COUNT); Console.ReadLine(); } } }
程序执行后输出如图 3-10 所示。
图 3-10 程序代码 3-10 的执行结果在程序代码 3-10 中,首先由用户输入一串字符并送给字符串变量 text,foreach 语句先
取字符串变量 text 的第一个字符送给字符变量 ch,判断该字符是否在小写的“a”到“z”之
间,或者大写的“A”到“Z”之间,如果是则把计数器 COUNT 的值加 1,否则取下一个字
符送给字符变量 ch,再次进行判断,直到把字符串变量的每一个字符都读取一遍为止。
3.3 跳转语句
使用循环语句时,如果循环条件不被改变,循环就会一直进行下去,这就是“死循
环”。避免“死循环”有两种方法:一是改变循环条件,二是使用跳转语句。跳转语句能够
无条件地改变程序的控制权。
3.3.1 break 语句
在 switch,while,do…while,for 或 foreach 语句的循环体中,使用 break 语句将直接退
出当前正在执行的循环或 switch 语句。break 语句的语法格式如下:
break;
如果 break 语句不在循环内或被 switch 语句所封闭(try 块除外),则会发生编译错误。
程序代码 3-11 用于判断一个正整数是否为素数。如果一个数除了 1 和本身之外,不能
被小于该数的数整除,则该数为素数,素数也称为质数。程序代码 3-11 的算法是把输入的
数依次除以 2~ x 之间的数,若都不能整除则为素数;若有一次被整除则不是素数,退出
循环。
程序代码 3-11 判断素数
using System; namespace P3_1153
第 3 章 结构化程序设计 {
class Program {
static void Main(string[] args) {
Console.WriteLine("请输入一个正整数:"); int x,i;
bool flag = true;
int.TryParse(Console.ReadLine(), out x);
for (i = 2; i <=Convert.ToInt32 ( Math.Sqrt(x)); i++) { if (x % i == 0) { Console.WriteLine("{0}不是一个素数", x); flag = false; break; } } if (flag ) Console.WriteLine("{0}是一个素数", x); Console.ReadLine(); } } }
程序代码 3-11 的执行结果如图 3-11 所示。
图 3-11 判断素数
程序代码 3-11 说明如下:
(1)Math.Sqrt(x)是对变量 x 求平方根运算。
(2)Convert.ToInt32 (x)是把变量 x 转换成整型数。
(3)布尔变量 flag 初始值是 true,当经过循环语句的检测后其值仍然是 true,表示在
2~ x 之间的数没有数能整除用户所输入的数,表示该输入的数是素数。
程序代码 3-12 是对程序代码 3-11 的一个改写,使用双重循环实现让用户输入一个数,
然后把比该数小的所有素数都显示出来。
程序代码 3-12 显示比某数小的所有素数
using System; namespace P3_12 { class Program {static void Main(string[] args) {
54 C#程序设计 Console.WriteLine("请输入一个正整数:"); int i,x, l; bool flag ; int.TryParse(Console.ReadLine(), out x); for (i = 2; i <= x; i++) { flag = true; for (l = 2; l <= Convert.ToInt32(Math.Sqrt(i)); l++) { if (i % l == 0) { flag = false; break; } } if (flag) Console.Write("{0} ", i); } Console.ReadLine(); } } }
程序代码 3-12 的执行结果如图 3-12 所示。
图 3-12 判断素数3.3.2 continue 语句
continue 语句主要用在 while、do…while、for 或 foreach 等循环语句中,用于结束本次
循环,即跳过 continue 语句后面尚未执行的语句。continue 语句并不跳出当前的循环体,只
是终止本次循环,接着进行下一次循环是否执行的判定。continue 语句的格式如下:
continue;如果 continue 语句不是在循环体内,则会发生编译错误。当 continue 语句在多个循环语
句彼此嵌套的最里层时,同 break 语句一样,continue 语句只对最里层的循环语句起作用。
若要穿越多个嵌套层直接转移控制,也须使用 goto 语句。
程序代码 3-13 用于计算数列 1+2+3+6+7+9+11…+99 之和(不包括 4 和 5 的倍数)。
程序代码 3-13 计算数列 1+2+3+6+7+9+11…+99 之和(不包括 4 和 5 的倍数)
using System; namespace P3-13 { class Program55
第 3 章 结构化程序设计 {
static void Main(string[] args) { int i, s = 0; for (i = 1; i < 100; i++) { if ((i % 4 == 0)||(i % 5 == 0)) continue; //不计算 4 和 5 的倍数 Console.Write(i); if (i < 99) Console.Write("+"); s += i; } Console.Write("="); Console.WriteLine(s); Console.ReadLine(); } } }
程序代码 3-13 的执行结果如图 3-13 所示。
图 3-13 计算数列 1+2+3+6+7+9+11…+99 之和(不包括 4 和 5 的倍数)3.3.3 goto 语句
goto 语句可以直接跳转到程序中用标号所指定的另一条语句。标号是一个标识符后跟一
个冒号,标号用于指定程序的语句位置。由于 goto 语句打乱结构化程序设计语句的顺序,
所以目前的高级语言都不建议使用。goto 语句的语法格式如下:
goto 标号;goto 语句可以从语句块跳出。goto 语句不能跳转到其他的语句块内,也不能从一个方法
跳转至另一个方法,更不能跳出类的范围。
程序代码 3-14 是实现当用户输入身份证号码后,能判别其是男性还是女性。目前我国
使用的身份证号码是 18 位,其中前 6 位为省市地区码,接着的 8 位为出生年月日,后 4 位
中的最后一位是校验码,可用于区分身份证号码的真假,紧挨着的 3 位是顺序码,用于同一
地区在同年同月同日出生的人的身份区别,这 3 位数单数表示男,双数表示女。所以,可用
18 位身份证号的倒数第 2 位的单双区分男女。
程序代码 3-14 根据身份证号判断性别
using System; namespace P3-14 { class Program {56 C#程序设计
static void Main(string[] args) { string slb; Console.Write("请输入 18 位身份证号码:"); do { slb = Console.ReadLine(); if (slb.Length == 18) //测试身份证的长度是否是 18 位 goto LB_OUT; //跳转至标号 LB_OUT Console.Write("长度不正确\n 请重新输入 18 位身份证号码:"); }while(slb.Length != 18); LB_OUT: Console.Write("身份证号码为: "+slb); if (slb[16] % 2 == 0) Console.WriteLine(", 性别为女"); else Console.WriteLine(", 性别为男"); Console.ReadLine(); } } }
程序代码 3-14 的执行结果如图 3-14 所示。
图 3-14 程序代码 3-14 的执行结果goto 语句是典型的非结构化控制语句,在程序中应限制使用。此外,goto 语句尽管看上
去很强大,但通过循环语句和其他跳转语句,总是能够实现 goto 语句所能实现的任何功
能。下面使用代码 3-15 来消除代码 3-14 中的 goto 语句。
程序代码 3-15 根据身份证号判断性别
using System; namespace P3_15 { class Program {static void Main(string[] args) {
string slb;
Console.Write("请输入 18 位身份证号码:"); do
57 第 3 章 结构化程序设计 slb = Console.ReadLine(); if (slb.Length == 18) //测试身份证的长度是否是 18 位 { Console.Write("身份证号码为: " + slb); if (slb[16] % 2 == 0) Console.WriteLine(", 性别为女"); else Console.WriteLine(", 性别为男"); } else Console.Write("长度不正确\n 请重新输入 18 位身份证号码:"); }while(slb.Length != 18); Console.ReadLine(); } } }
3.3.4 return 语句
return 语句用于方法的结束,并将控制权转移给方法的调用程序。程序主方法 Main()
中的 return 语句表示整个应用程序的退出点。return 语句要求后面要跟与方法返回类型相
同的表达式。如果方法返回类型为 void,则可以使用不带表达式的 return 语句。例如程序
代码 3-16 中定义了判断一个数是否是偶数的 IsNumic 方法,如果是偶数,则方法返回
true,否则返回 false。
程序代码 3-16 判断奇偶数
using System; namespace P3_16 { class Program {static void Main(string[] args) { Console.WriteLine("请输入一个正整数:"); int x; int.TryParse(Console.ReadLine(), out x); if (CzMath.IsNumber(x)) Console.WriteLine("{0}是一个偶数", x); else Console.WriteLine("{0}不是一个奇数", x); Console.ReadLine(); } }
public class CzMath {
public static bool IsNumber(int x) {
if (x % 2 == 0) return true;
58 C#程序设计 else return false; } } }
本章小结
本章主要说明控制结构如何改变程序执行的流程,而在 C#中控制结构使用的关键字包
括:选择控制—if、else、switch、case;循环控制—while、do、for、foreach;跳转控
制—break、continue、return、goto。而在这些控制结构中比较难的是对循环结构语句的选
取,需要特别说明的是 while 循环语句也称当型循环语句,主要在事先不知道需完成的循环
次数时使用;do…while 循环语句也称为直到型循环语句,主要在已知至少完成一次循环时
使用;for 循环主要在已知需完成的循环次数时使用;foreach 循环主要应用于集合类型,用
于遍历集合内各元素。
控制结构是结构化程序设计中的关键要素。把正常的顺序执行与这些选择、循环、跳转
语句结合起来,能够在程序中实现各种复杂的算法。
习题三
一、选择题 1.以下程序的输出结果是( )。 using System; class Program {static void Main() { int a=10; int b; b=2*a+20; Console.WriteLine(b); } } A.10 B.20 C.30 D.40 2.对于跳转语句 break 和 continue,说法正确的是( )。 A.continue 语句只能用于循环体中 B.break 语句只能用于循环体中 C.continue 和 break 语句的跳转范围不明确,容易产生歧义 D.break 语句是无条件跳转语句,continue 语句不是 3.有下列语句 int a = 20, b = 5, c = 10, d = 3; bool s, e = false; 则表达式“(s = a < c) && (e = b;d > 0)”运算后,e 的值是( )。
59
第 3 章 结构化程序设计
4、能够列举集合中的每一个元素的循环语句是( )。
A.while B.do…while C.for D.foreach
5.for(int i=10,j=1000;i>=0 && j!=0;i++ )循环的执行次数是( )。
A.1000 B.11 C.10 D.0
6.if 语句后面的表达式应该是( )。
A.逻辑表达式 B.条件表达式
C.算术表达式 D.任意表达式
7.能够中断当前的选择或循环,并跳出当前的选择或循环的语句是( )。
A.exit B.break C.goto D.continue
8、能够结束本次循环的语句是( )。
A.exit B.break C.goto D.continue
9.下列程序所计算的数学式是( )。
int a=0,i=2;
while(i<100){ a+=i; i+=2; } Console.WriteLine("a={0}",a); A.a=1+2+4+…+98 B.a=1+2+4+…+100 C.a=2+4+6+…+98 D.a=2+4+6+…+100 10.以下程序的输出结果是( )。 int a=10; do { Console.WriteLine(a); }while(a>10); A.10 B.9 C.无输出 D.死循环 11.若“int m,n,r;”,则以下正确的是( )。
A.if(m <> n) r ; B.if(m == n) r ; C.if(!m) r; D.if(m=<n) r ; 12.阅读下面程序:
using System; class test {
static void Main() { int s=0; for(int i=1;i<=100;i++) { if(i%2==0) s=s+i; } Console.WriteLine(s); } } 程序的执行结果是输出( )。 A.1 到 100 之间的整数之和 B.0 到 100 之间的所有整数 C.1 到 100 之间的偶数之和 D.1 到 100 之间的奇数之和 二、指出下语句段中的错误并改正 1.if (nMyValue1=5) i=1;
60 C#程序设计
2.if(nMyValue2==1)i=1; 3.int[] myInt={1,2,3}; foreach(int test in myInt) {
test++;
Console.WriteLine(temp); }
4.int[] myInt1={1,2,3}; foreach(int test in myInt1) { Console>WriteLine(test); } 三.阅读程序 1.下面程序段执行结束后,输出结果是什么? int r=0; for (int i = 1; i <= 10; i ++) { while(true) { if (i % 4==0) break; else i++; } r+=i; } Console.WriteLine(r); 2.分析下面的程序,试找出并改正其中的错误;如果没有错误则写出程序的运行结果。 using System; namespace Q3_1 { class Program {
static void Main() {
int[] iArray = new int[] { 5, 6, 7 }; Color[] cArray = (Color[])iArray;
Console.WriteLine("{0} {1} {2}", cArray[0], cArray[1], cArray[2]); } } enum Color { 赤, 橙, 黄, 绿, 蓝, 靛, 紫 }; } 3.下面程序的输出结果是什么? using system; Class Example1 {
61
第 3 章 结构化程序设计 Public Static void main()
{ int x=1,a=0,b=0; Switch(x) { Case 0:b++,break; Case 1:a++,break; Case 2:a++,b++,break; } Console.Writeline(“a={0},b={1}”,a,b); } } 4.下列代码的输出结果是什么? namespace Answer { class Program {
static void Main(string[] args) { int i,j; for(i=1;i>=0;i--) for(j=0;j<=i;j++) Console.WriteLine(“i*j={0}”,i*j); } } } 5.分析下面程序的运行结果。 using System; class Test {
public static void Main() {
int[,] a=new int[6,6]; a[0,0]=1; for(int i=1;i<=5;i++) { a[i,0]=1; a[i,i]=1; for(int j=1;j<=i;j++) { a[i,j]=a[i-1,j-1]+a[i-1,j]; } } for(int i=0;i<=5;i++) { for(int j=0;j<=i;j++) { Console.Write(" {0} ",a[i,j]); }
62 C#程序设计 Console.WriteLine(); } } } 四、程序填空 若十进制的三位数中每一位的数字均不相同,则这样的三位数共有多少个?以下程序回答了这个问 题。请在空白处填入适当的内容,把程序补充完整。 int r=0;
for (int i = 1; i < 10; i++) { for (int j = 0; j < 10; j++) { if ( (1) ) continue; else { for (int k = 0; k < 10; k++) if ( (2) ) r++; } } } Console.WriteLine(r); 五、程序设计 1.一个数如果恰好等于除它本身之外的各个因子之和,则称该数为“完数”,例如:6 的因子为 1,2,3,且 6=1+2+3。编写一个控制台程序,能够求出 1000 以内的所有“完数”。 2.编写一个控制台程序,能够计算 1!+2!+3!+4!+…+n!的值,n 从键盘输入。