1、 1 第 5 章 循环程序结构设计在编写程序过程中,往往出现相同类型操作需要重复出现,如实现 1+2+100,则需要做 99 次加法,这类问题使用循环语句解决,可以使问题变得简单。即循环语句用于实现语句块的重复执行。根据问题的具体情况,C#中提供了四种不同的循环机制: for 循环 while 循环 dowhile 循环 foreach 循环5.1 for 循环语句for 循环常常用于已知循环次数的情况,使用该循环时,测试是否满足某个条件,如果满足条件,则进入下一次循环,否则,退出该循环。5.1.1 for 语句的语法格式格式:for(表达式 1(initializer);表达式 2(cond
2、ition ); 表达式 3(iterator)) controlled-statement 其中表达式 1 的用于参与循环条件变量的初始化,该表达式仅执行一次;表达式 2 为条件判断表达式,即每次循环体开始之前,进行判断该表达式是否成立,如果成立,进入下一次循环,否则,循环结束;表达式 3 用于参与循环条件变量的运算,一般为递增或递减的循环计数器。流程图如图 5-1。2 表达式 2循环体表达式 1表达式 3F a l s eT r u e图5-1 for循环流程图该结构中,表达式 1、表达式 2、表达式 3 是可选的,但应该注意死循环的发生。如表达式 2 省略,并且不采用转移语句,会导致死循
3、环的发生。可以在循环体中的任何位置放置 Break 语句来强制终止 For 循环随时跳出 For 循环。 Break 语句通常用于 If 语句之后。可以在循环体中的任何位置放置 Continue 语句,在整个循环体没有执行完就重新开始新的循环。Continue 语句通常用于 If 语句之后。5.1.2 for 循环语句的使用根据下面的实例,了解 for 语句的工作流程及实现方法。【例 5-1】计算 1+2+3+100。使用 for 语句实现。分析:该问题属于重复执行加法的问题,并且参与运算的两个操作数不断的的按规律增加。该类问题可以通过循环进行解决。使用一个标签 label1 和一个按钮 bu
4、tton1 进行窗体设计。窗体及控件的基本属性设计如图3-9 左图。在窗体设计图上,双击按钮 button1 编写相应的方法。代码如下。private void button1_Click(object sender, System.EventArgs e)int sum;sum=0;for(int k=1;k50)label2.Text=“母牛的总数多于50的是“+y.ToString();break;elsey+;该问题使用break语句跳出循环,因为当满足sum450时,是要计算的 y的值。程序运行结果如图5-7。5.3 dowhile 循环dowhile循环非常类似于 while循环。
5、一般情况下,可以相互转换使用。它们之间的差别在于while循环的测试条件在每一次循环开始时执行,而dowhile循环的循环的测试条件在每一次循环体结束时进行判断。同样的,dowhile 可以一些循环问题,但使用的频率较少。5.3.1 dowhile 的语法格式dowhile的一般格式 :do 循环体( controlled-statement) while(布尔条件表达式(condition) )说明:(1)布尔条件表达式是一个具有 Boolean 值的条件表达式,为循环的条件。(2)循环体可以是一条语句,也可以是多条语句。(3) 循环的执行过程:首先执行循环体 ,然后计算条件的值,如果条件为
6、假8 (False) ,则开始一个新的循环;如果条件为真(True) ,则终止循环,执行 Until条件后面的语句。(4) 可以在循环体中的任何位置放置 Break 语句来强制终止 dowhile 循环随时跳出循环。Break 语句通常用于 If 语句之后。(5) 可以在循环体中的任何位置放置 Continue 语句,在整个循环体没有执行完就重新判断条件 ,以决定是否开始新的循环。Continue 语句通常用于 If 语句之后。该语句结构的程序流程图如图5-8。循环体布尔条件表达式T r u eF a l s e图5-8 dowhile语句的流程图根据流程图可以看出,该循环的循环体至少执行一次
7、。举例分析。代码段一: int a = 0; while( a 0 ) a-; 变量 a 初始值为 0,条件 a0 显然不成立。所以循环体内的 a-;语句未被执行。本段代码执行后,变量 a 值仍为 0; 代码段二: int a = 0; do a-; while( a 0 ); 尽管循环执行前,条件 a0 一样不成立,但由于程序在运行到 do.时,并不先判断条件,而是直接先运行一遍循环体内的语句:a-。于是 a 的值成为-1,然后,程序才判断 a0,发现条件不成立,循环结束。9 5.3.2 dowhile 的使用【例 5-6】使用 do-while 语句实现 1+2+3+100。窗体及控件的属
8、性设计见【例 5-1】 。代码如下。private void button1_Click(object sender, System.EventArgs e)int sum;sum=0;int k=1;dosum=sum+k;k+;while(kyearEnd) /如果选择的起始年份大于截止年份,则不执行任何操作return;lstOut.Items.Clear( ); /清除上次判断显示的内容for(int i=yearStart;i=yearEnd;i+) /按指定年份范围循环if(i%4=0 /将闰年的年份追加到列表框【清除】按钮被单击时执行的事件代码如下:private void bt
9、nClear_Click(object sender, System.EventArgs e)lstOut.Items.Clear( ); /清空列表14 5.5 使用计时器控件(Timer)计时器(Timer)控件在工具箱的图标为 ,它是一种无需用户干预,按一定时间间隔周期性地自动触发事件的控件。一般用来检查系统时间,判断是否该执行某项任务,也可以用于后台处理。Timer 控件在程序运行时是不可见的,所以将其添加到窗体后显示在窗体设计器下方的组件窗格中。5.5.1 计时器控件的属性、方法和事件Timer 控件的主要属性、方法和事件见表 5-4。表 5-4 Timer 控件的主要属性、方法和事
10、件名称 说明Enabled 该属性为 True 时,计时器开始工作,为 False 时暂停。属性Interval 该属性用来设置计时器触发的周期(以毫秒计)取值范围为 064767。Start 启动 Timer 控件,相当于将 Enabled 属性设置为 True方法Stop 停止 Timer 控件,相当于将 Enabled 属性设置为 False事件 Tick 计时器开始工作时由系统触发的事件,用户无法直接触发该事件5.5.2 计时器控件应用实例【例 5-9】设计一个倒计时程序,用户在 “倒计时”文本框中输入倒计时的分钟数,按钮回车键,开始倒计时。程序运行结果如图 5-16 所示程序设计步骤
11、:(1) 设计程序界面新建一个 C#项目,向窗体中添加 5 个标签控件,3 个文本框控件,1 个按钮控件。适当调整各对象的大小及位置。添加两个计时器控件,这两个控件将显示在设计视图的组件栏中。(2) 设置对象属性各控件的 Text 属性值参照图 5-17 所示设计界面设置。图5-16 运行结果 图5-18 设计界面在代码设计中需要用到的控件的 Name 属性设置见表 5-5。15 表 5-5 各控件 Name 属性设置原 Name 属性值 修改 Name 属性值 说明label1 lblTimeStart 对应“当前时间”标签标题label3 lblRemainder 对应设计时标题为空的标签
12、label5 lblTimeEnd 对应“结束时间”标签标题textBox1 txtTimeStart 显示当前时间及倒计时开始时间的文本框textBox2 txtNumber 输入倒计时分钟数textBox3 txtTimeEnd 显示倒计时期间的时间button1 btnReset 单击该按钮恢复初始状态将 txtTimeStart 与 txtTimeEnd 文本框的只读属性设置为 true。设置两个计时器的 Interval 属性值为 1000,即 1 秒钟激发一次。(3) 编写程序代码首先在类定义开始处声明必须的变量字段如下:uint remainder; /保存倒计时的剩余总秒数ui
13、nt minute; /保存倒计时剩余分钟数uint second; /保存倒计时剩余秒数string msg; /保存倒计时总信息保证窗体处于选中状态,单击属性窗口的事件按钮 ,在事件列表中找到 Activated 事件,如图 5-20 所示。用鼠标双击该事件,添加代码以保证窗口被激活时 txtNumber 控件获得焦点,代码如下:private void Form1_Activated(object sender, System.EventArgs e)txtNumber.Focus( ); /输入文本框获得焦点以同样方法添加为控件 txtNumber 添加 KeyPress(键盘事件代码
14、如下:private void txtNumber_KeyPress(object sender,System.Windows.Forms.KeyPressEventArgs e)if(e.KeyChar=r) /按回车键则执行下面的代码(开始倒计时)if(txtNumber.Text=“)return;remainder=Convert.ToUInt32(txtNumber.Text)*60; /将分钟换算为秒timer2.Enabled=false; /第 2 个计时器终止工作timer1.Enabled=true; /第 1 个计时器开始工作lblTimeEnd.Visible=true
15、; /显示控件txtTimeEnd.Visible=true; /显示控件lblTimeStart.Text=“开始时间: “; /更换标签标题图5-20 添加Activated事件代码16 双击控件 timer2 添加事件代码如下:private void timer2_Tick(object sender, System.EventArgs e) /在 txtTimeStart 文本框中显示时间txtTimeStart.Text=DateTime.Now.Hour.ToString( )+“:“+DateTime.Now.Minute.ToString( )+“:“+DateTime.No
16、w.Second.ToString( );双击控件timer1添加代码如下:private void timer1_Tick(object sender, System.EventArgs e) 在 txtTimeEnd 文本框中显示时间txtTimeEnd.Text=DateTime.Now.Hour.ToString( )+“:“+DateTime.Now.Minute.ToString( )+“:“+DateTime.Now.Second.ToString( );remainder-; /总秒数减 1minute=remainder/60; /求出总秒数折合的分钟数second=rema
17、inder%60; /折合分钟后剩余的秒数if(second10) /剩余的秒数不足 10,则添加前导 0msg=“剩余时间:“+minute+“分 0“+second+“秒“;elsemsg=“剩余时间:“+minute+“分“+second+“秒“;lblRemainder.Text=msg; /将 msg 信息在标签中显示if(remainder=0) /如果剩余总秒数为 0timer1.Enabled=false; /倒计时时间到 timer1 停止工作lblRemainder.Text+=“-时间到!“; /显示时间到信息【重新开始】按钮被单击时执行的事件代码如下:private void btnReset_Click(object sender, System.EventArgs e)lblRemainder.Text=“; /清空 lblRemainder 标签txtNumber.Text=“; /清空输入文本框txtNumber.Focus( ); /输入文本框获得焦点timer2.Enabled=true; /计时器 2 开始工作lblTimeEnd.Visible=false; /隐藏 lblTimeEnd 标签控件txtTimeEnd.Visible=false; /隐藏 txtTimeEnd 标签控件5.6 习题