第04章 顺序结构程序设计.docx
《第04章 顺序结构程序设计.docx》由会员分享,可在线阅读,更多相关《第04章 顺序结构程序设计.docx(25页珍藏版)》请在冰豆网上搜索。
第04章顺序结构程序设计
第4章选择结构程序设计
在前面的章节中,我们使用程序指令顺序执行完成相关的操作。
一般情况下,每个程序要求在运行过程中,改变语句的执行顺序达到某种功能的实现,这种情况下要用到程序控制语句。
C#程序的控制语句包括选择语句、循环语句和转移语句。
本章主要介绍用于选择的选择结构。
通过本章的学习,掌握以下内容:
●if语句的使用
●switch语句的使用及switch语句中break的使用
●goto语句的使用
4.1选择结构程序结构的设计
当程序中一个问题出现有两个或多个不同的分支要根据具体情况进行解决,需要使用选择语句控制程序的流程实现。
选择语句根据布尔条件表达式的值选择要执行的分支语句,从而实现流程控制。
如学生报到时,会根据不同的系别选择分配班级,同一个班级内根据不同的性别选择分配寝室。
那么,本例中含有选择:
不同系别分配不同的班级属于多分支条件选择,因为一个学生将从多个系中选择其中一个;同一个班级内根据性别的不同分配男生、女生寝室,属于单条件选择。
在C#中,提供两种选择语句实现流程的改变:
if语句,用于判断特定的条件能否满足,用于单分支选择,也可以通过嵌套实现多分支选择。
switch语句,用于多分支选择。
4.2单分支选择结构(if语句)
if语句是程序设计中基本的选择语句,它根据条件表达式的值选择要执行的后面的内嵌语句序列。
一般用于简单选择,即选择项中有一个或两个分支,语句执行的过程中根据不同的情况进行选择其中一个分支执行,
格式:
if(布尔条件表达式condition)
内嵌语句序列1
else
内嵌语句序列2;
说明:
(1)若布尔表达式的值为真时,程序执行内嵌语句序列1,否则执行内嵌语句序列2。
(2)ifelse语句中,内嵌语句序列1和内嵌语句序列2可以是简单语句,也可以是复合语句。
(3)如果内嵌语句序列中为多个执行语句要使用花括号({…})组合为一个语句块。
(4)也可以省去else和内嵌语句序列2,即当程序满足布尔表达式的值为真时,执行语句序列1。
该结构的流程图如图4-1。
4.2.1if…else语句
根据布尔条件表达式的值进行判断,当该值为真时执行if语句后的语句序列,当为假时,执行else语句后的语句序列。
该结构一般用于两种分支的选择。
下面结合实例了解if…else语句的使用方法。
例题采用WindowsApplication的项目开发方法进行编写。
【例4-1】某商店为了吸引顾客,采取以下优惠活动:
所购商品在1000元以下的,打9折优惠;所购商品多于1000元的,打8折优惠。
试采用if语句实现该优惠。
图4-2实现打折优惠
分析:
该问题属于数学分段函数问题,当所购商品总额<1000元时,打折后的商品总额为(所购商品总额*0.9);当所购商品总额>1000时,打折后的商品总额为(所购商品总额*0.8)。
该问题可以选择所购商品总额<1000作为条件,也可以选择所购商品总额>1000为条件,本例中选择所购商品总额<1000作为条件完成选择判断。
根据以上分析,画出相应的流程图如图4-3。
图4-3程序流程图
设计步骤如下:
(1)建立项目。
在VisualStudio.NET中,打开“文件”菜单,依次选择“新建→项目”命令,打开“新建项目”对话框,选择“VisualC#项目”,选择“Windows应用程序”输入项目的名称和存放位置。
(2)设计窗体。
单击工作区左侧的“工具箱”或单击工具栏上工具箱图标
,工具箱将显示在工作区左侧。
本例中使用标签控件label显示相应的文本,使用旋钮控件NumericUpDown提供相关的数值,使用按钮控件Button实现交互。
窗体及控件的主要属性设计见表4-1。
表4-1窗体及控件的主要属性设计
控件名
属性
属性值
说明
Form1
Text
if语句的使用
显示窗口标题
label1
Name
label1
标识该控件
Text
根据所购商品的金额实现打折优惠
在窗体中显示文本信息
label2
Name
label2
标识该控件
Text
请输入所购商品的总金额
在窗体中显示文本信息
label3
Name
label2
标识该控件
Text
打折后商品总额
在窗体中显示文本信息
button1
Name
button1
标识该控件
Text
打折
文本显示
numericUpDown1
Name
numericUpDown1
标识该控件
Decimalplaces
0
描述该控件接受的数据为int类型
Maximim
接受的最大值
numericUpDown2
Name
numericUpDown2
标识该控件
Decimalplaces
0
描述该控件接受的数据为int类型
Maximim
接受的最大值
(3)编辑代码。
选中button1控件,单击鼠标右键,在弹出的菜单中选择“查看代码”命令,或通过“视图”菜单中的“代码”命令,切换到代码视图。
也可以双击控件直接在事件中添加代码。
代码如下。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
doublek,m;
k=(double)numericUpDown1.Value;
if(k<1000)
{m=k*0.9;}
else
{m=k*0.8;}
numericUpDown2.Value=(decimal)m;
}
(4)编译、运行程序。
单击工具栏上的启动按钮,或使用F5执行程序,显示Windows窗体,如图4-2右图所示。
在numericUpDown1中输入相关金额,单击button1按钮,完成相应的功能。
【例4-2】编辑框的PasswordChar属性可以隐蔽用户通过键盘输入的字符,常用来编写检查用户口令的程序。
使用选择语句实现该操作。
分析:
本题使用编辑框实现命令接受工作,使用if语句实现判断。
采用基本的控件实现如下所图3-4。
(1)建立项目。
建立一个Windows应用程序。
(2)设计窗体。
单击工作区左侧的“工具箱”或单击工具栏上工具箱图标
,工具箱将显示在工作区左侧。
本例中使用两个label控件、一个button控件、一个textBox控件实现程序界面。
label1控件用于显示提示用户输入预先已经设置好的口令,本程序设置口令为“abc”,label2用于显示显示用户输入的口令正确与否,本例中设置当口令输入正确的情况下label2显示为“欢迎使用本系统!
”,否则,显示“对不起,您的口令有误,您无权使用该系统!
”。
本例中所有控件的字体均设为四号、加粗字体。
窗体及控件的主要属性设计见表4-2。
图4-4口令验证
表4-2窗体及控件的主要属性设计
控件
属性
属性值
说明
Form1
Text
使用基本控件实现口令判断
显示窗体标题
label1
Text
请输入口令
显示相应文本
TextAlign
TopLeft
文本显示位置为左上方
label2
Text
label2
显示相应文本
TextAlign
MiddleRight
文本显示位置为中间
button1
Text
验证
显示相应文本
(3)编辑代码。
该程序通过对button1单击,实现对输入命令的验证。
在窗体上双击button1控件,实现对该控件单击事件编程。
代码如下。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
if(textBox1.Text=="abc")//设口令为“abc”
label2.Text="欢迎使用本系统!
";//如果输入正确,显示"欢迎使用本系统!
"
else//如果输入不正确
label2.Text="对不起,您的口令有误,您无权使用该系统!
";
}
(4)编译、运行程序。
执行程序,输入口令,单击“验证”按钮,实现程序的执行。
如输入“abc”,运行结果见图-4右图。
4.2.2if…else…if语句
if…else语句也可以用于多种分支的选择结构,这种情况也就是if语句嵌套if语句的结构。
if语句中,内嵌语句可以是复合语句,也就是说,内嵌语句中可以包含选择语句、循环语句等。
那么,if语句可以嵌套,但应注意if-else的配对问题。
在默认情况下,else语句总是和最近的【例4-3】if语句配对。
根据【例4-3】了解if语句的嵌套方法。
【例4-3】将百分制成绩转换为五分制成绩。
转换标准如下:
90分以上为“优秀”,80分以上为“良”,70分以上为“中”,60分以上为“及格”,60分以下为“不及格”。
分析:
该问题为多条件选择情况,在这种情况下,需进行选择实现问题的方法。
本题中使用if语句可以由两种方法实现:
一种自底向上,即是先判断是不是及格,然后根据及格情况再进行判断相应的五分制得分;一种是自顶向下,即先判断是不是优,然后依次判断。
本题使用后一种方法实现。
第一种方法的实现由读者尝试解决。
该问题的流程图如图3-5。
该问题的实现使用了一个numericUpDown控件,用于接收百分制成绩;使用两个label控件,用于显示提示文本;使用了两个button控件,用于实现成绩转换事件的实现和窗体的关闭。
窗体及控件的属性设置见图3-6左图所示。
在窗体上双击“转换”按钮,为其添加相应的代码实现成绩转换的功能。
代码如下。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
intk;
k=(int)numericUpDown1.Value;
if(k>90)
textBox1.Text="优";
else
if(k>80)
textBox1.Text="良";
else
if(k>70)
textBox1.Text="中";
else
if(k>60)
textBox1.Text="及格";
else
if(k<60)//此条指令可以省略
textBox1.Text="不及格";
图3-5成绩转换流程图
}
双击“关闭”按钮,添加相应的是先窗体关闭的代码如下。
privatevoidbutton2_Click(objectsender,System.EventArgse)
{this.Close();
}
执行运行命令,输入百分制成绩为“56”,单击转换按钮,在五分制成绩中将显示成绩为“不及格”。
如图4-6右图。
图4-6成绩转换设计
上例中使用了if语句的嵌套实现,其中因为条件判断后只用一个语句,如“textBox1.Text="良";”,所以,可以省略{},当存在多条语句时,要使用{}表示为一个语句块。
在程序的最后对不及格成绩的判断总使用“if(k<60)”指令实现,该指令可以省略;该指令使用时,没有else语句进行配对。
即在if语句中,可以不使用else语句。
4.3多分支选择结构(switch语句)
if语句每次判断只能有两个分支,如果在多重分支的情况下,使用if语句实现比较复杂,使用开关语句即switch语句可以方便解决这种问题。
如【例4-3】中,使用多次if语句实现了成绩转换的功能,如果使用switch语句很方便地解决。
4.3.1switch语法格式
和if语句相比,switch语句有一个控制表达式,其分支语句根据控制表达式的值执行不同的程序段。
格式:
switch(控制表达式)
{
case常量表达式:
内嵌语句
default:
内嵌语句
}
其中控制表达式所允许的数据类型为:
整数类型(sbyte,byte,short,ushort,uint,long,ulong),字符类型(char),字符串类型(string),或者枚举类型以及能够隐式转换成上述的任何类型。
各个case语句后的常量表达式的数据类型与控制表达式的类型相同或能够隐式转换为控制表达式的类型。
switch语句基于控制表达式的值选择要执行的语句分支。
switch语句按以下顺序执行:
1、控制表达式求值。
2、如果case标签后的常量表达式等于控制语句所求出的值,则其后的内嵌语句被执行。
3、如果没有常量表达式等于控制语句的值,则执行default标签内的内嵌语句。
4、如果控制表达式的值不满足case标签,并且没有default标签,控制转向switch语段的结束端。
需要注意的是,为了表示选择的执行以及分支之间的区别,需要在case标签后的内嵌语句的结束使用break语句,以便跳出switch语句,否则,将会产生编译错误。
1.break语句
break语句用于停止贯穿语句的执行。
即在switch语句结构中,break语句用于选择分支的语句运行。
也可使用goto语句实现语句转移,但是为了程序,尽量避免使用这种方法。
如果case语句后有处理语句,需要break语句作为结束。
但是,在switch语句中,多个case语句可以使用同一个处理语句,下例中描述了break的使用。
【例4-4】使用switch语句描述工作日和周末。
图4-7描述工作日
本程序的设计如图4-7。
采用MessageBox.Show方法实现消息框显示。
编码如下。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
strings;
s=textBox1.Text;
switch(s)
{
case"星期一":
case"星期二":
case"星期三":
case"星期四":
case"星期五":
MessageBox.Show("今天是工作日,您需要上班","提示");
break;
case"星期六":
case"星期日":
MessageBox.Show("今天是休息日","提示");
break;}
}
执行程序,输入“星期四”,程序的运行结果如图4-7右图。
该例中前四个case语句为空,在第五个case语句中使用处理语句。
这种情况下,前五个case语句使用同一个处理语句。
后两个使用同一处理语句。
每个处理语句的结束使用break结束,否则,编译不能通过。
2.default标签
在switch语句中,常常用到default标签来处理不满足case语句的值,定义default标签可以增强处理相应的异常。
如【例4-4】中,可以添加default标签处理其它不合格的输入:
default:
showMessageBox.Show("你的输入有误","提示");
break;
4.3.2switch使用
下面我们结合实例了解switch的用法。
【例4-5】使用switch语句实现【例4-3】。
程序的界面设计和运行见【例4-3】。
代码如下。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
intk=(int)numericUpDown1.Value;
switch(k/10)
{
case9:
textBox1.Text="优";
break;
case8:
textBox1.Text="良";
break;
case7:
textBox1.Text="中";
break;
case6:
textBox1.Text="及格";
break;
default:
textBox1.Text="不及格";
break;}
【例4-6】某航空公司规定在旅游的旺季7~9月份,如果订票数超过20张,票价优惠15%,20张以下,优惠5%;在旅游的淡季1~5月份、10月份、11月份,如果订票数超过20张,票价优惠30%,20张以下,优惠20%;其他情况一律优惠10%设计程序,根据月份和订票张数决定票价的优惠率(如图4-8左)。
图4-8计算优惠价
该问题属于多分支选择问题。
该问题中旅游的淡季1~5月份、10月份、11月份的优惠率一样,在switch语句中,这几种情况可以使用同一种操作;旅游的旺季7~9月份的优惠率一样,可以使用同一种操作。
numericUpDown1的Maxinum的属性设置为12,Mininum的属性值设置为1。
该问题窗体及其余控件的属性设计如图4-8右图所示。
“计算优惠率”按钮实现代码如下。
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
intmon;
intsum;
mon=(int)numericUpDown1.Value;
sum=(int)numericUpDown2.Value;
switch(mon)
{
case1:
case2:
case3:
case4:
case5:
case10:
case11:
if(sum>20)
label3.Text="优惠率为30%";
else
label3.Text="优惠率为20%";
break;
case7:
case8:
case9:
if(sum>20)
label3.Text="优惠率为15%";
else
label3.Text="优惠率为5%";
break;
default:
label3.Text="优惠率为10%";
break;
}
}
代码中,前7种分支使用公共的代码段,所以共同使用1个break语句;7、8、9三种情况使用相同的代码段。
4.4使用单选按钮与复选框控件
有时,在程序中需要从几种条件中选择其中的一种,这时可以用单选按钮(RadioButton),例如是选择黑体字还是宋体字;如果需要同时考虑几种情况可以使用复选框(CheckBox),例如可以让文字同时具有加粗、倾斜、带下划线的风格。
4.4.1单选按钮(RadioButton)
单选按钮也叫选项按钮,为用户提供从多个选项中选择一个选项的功能,因此单选按钮顾名思义是一种“多选一”的控件。
从单选按钮的功能可以看出,这种控件一般都是成组使用而不单独使用。
单选按钮的常用属性见表4-3。
表4-3RadioButton常用属性
属性
属性值
说明
Checked
false/true
按钮是否被选中
Enabled
false/true
按钮是否可用
Appearance
Normal/Button
正常外观还是下压按钮外观
Appearance(外观)决定单选按钮以什么样式显示,Normal为标准外观,Button为通常的按钮形式,如图4-9和图4-10所示
图4-9Normal外观图4-10Button外观
在图4-9与图4-10中,右边的按钮处于选中状态,左边的按钮处于未选中状态。
【例4-7】设计Windows应用程序,单击【显示】按钮,根据对单选按钮的选择,分别显示日期或时间。
程序运行结果如图4-11和图4-12所示。
程序设计步骤:
(1)设计程序界面
创建Windows应用程序项目,在窗体设计视图中添加一个文本框、一个按钮和两个单选按钮。
设置各控件的属性如表4-4所示。
表4-4控件属性设置
控件对象名称
属性名称
属性值
说明
label1
Text
标签标题为空
Font
宋体,14.25pt,style=Bold
宋体,四号,粗体
RadioButton1
Text
显示日期
标签标题
Checked
false
未选中
RadioButton2
Text
显示时间
标签标题
Checked
ture
选中
button1
Text
显示
按钮的标题
程序设计界面如图4-13所示。
图4-11显示日期图4-12显示时间图4-13设计界面
(2)设计代码
在窗体设计视图双击标题为“显示”的按钮,设计按钮的单击事件代码如下:
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
if(radioButton1.Checked)//显示日期
label1.Text=DateTime.Now.Year+"年"
+DateTime.Now.Month+"月"
+DateTime.Now.Day+"日";
if(radioButton2.Checked)//显示时间
label1.Text=DateTime.Now.Hour+"时"
+DateTime.Now.Minute+"分"
+DateTime.Now.Second+"秒";
}
在上述代码中,使用两个条件判断语句,决定是执行显示日期的代码,还是执行显示时间的代码。
由于单选按钮的Checked属性只能有一个为真(ture),所以两个条件判断必然为一真一假,也就是说只能执行其中一个条件判断中的代码。
显示日期与时间使用了.NET类库中的DateTime结构,代码中的“Now”为DateTime结构的静态成员,从该成员可以获取系统当前日期与时间。
代码中的“Year”、“Month”、“Day”、“Hour”、“Minute”、“Second”,分别是系统日期与时间中的年、月、日、时、分、秒。
4.4.2复选按钮(CheckBox)
复选框顾名思义可以同时选中多个选项,也就是说用户可以在窗口同时选中多个复选框,这是其和单选按钮的区别。
复选框的常用属性见表4-5。
表4-5RadioButton常用属性
属性
属性值
说明
Checked
false/true
按钮是否被选中
CheckState
Unchecked/Checked/Indeterminate
未选中状态/选中状态/不确定状态
ThreeState
false/true
是否启用第三种状态
Enabled
false/true
按钮是否可用
A