第05章循环程序结构设计

上传人:仙*** 文档编号:182591088 上传时间:2023-01-26 格式:DOC 页数:16 大小:352KB
返回 下载 相关 举报
第05章循环程序结构设计_第1页
第1页 / 共16页
第05章循环程序结构设计_第2页
第2页 / 共16页
第05章循环程序结构设计_第3页
第3页 / 共16页
点击查看更多>>
资源描述
第5章 循环程序结构设计 在编写程序过程中,往往出现相同类型操作需要重复出现,如实现1+2+100,则需要做99次加法,这类问题使用循环语句解决,可以使问题变得简单。即循环语句用于实现语句块的重复执行。根据问题的具体情况,C#中提供了四种不同的循环机制:l for循环l while循环l dowhile循环l foreach循环5.1 for循环语句 for循环常常用于已知循环次数的情况,使用该循环时,测试是否满足某个条件,如果满足条件,则进入下一次循环,否则,退出该循环。5.1.1 for语句的语法格式 格式:for(表达式1(initializer);表达式2(condition);表达式3(iterator)) controlled-statement 其中表达式1的用于参与循环条件变量的初始化,该表达式仅执行一次;表达式2为条件判断表达式,即每次循环体开始之前,进行判断该表达式是否成立,如果成立,进入下一次循环,否则,循环结束;表达式3用于参与循环条件变量的运算,一般为递增或递减的循环计数器。流程图如图5-1。图5-1 for循环流程图 该结构中,表达式1、表达式2、表达式3是可选的,但应该注意死循环的发生。如表达式2省略,并且不采用转移语句,会导致死循环的发生。可以在循环体中的任何位置放置Break语句来强制终止For循环随时跳出For循环。Break语句通常用于If语句之后。可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新开始新的循环。Continue语句通常用于If语句之后。5.1.2 for循环语句的使用 根据下面的实例,了解for语句的工作流程及实现方法。【例5-1】计算1+2+3+100。使用for语句实现。 分析:该问题属于重复执行加法的问题,并且参与运算的两个操作数不断的的按规律增加。该类问题可以通过循环进行解决。 使用一个标签label1和一个按钮button1进行窗体设计。窗体及控件的基本属性设计如图3-9左图。在窗体设计图上,双击按钮button1编写相应的方法。代码如下。private void button1_Click(object sender, System.EventArgs e)int sum;sum=0;for(int k=1;k=100;k+) sum=sum+k;label1.Text=从加到100值为+sum.ToString(); /将sum显式转换为字符串 程序的运行结果如图5-2左图,单击“计算”按钮,将在标签上显示运行结果,如图5-2右图。 图5-2 程序运行结果private void button1_Click(object sender, System.EventArgs e)int sum;sum=0;for(int k=1;k=100;k+) sum=sum+k;label1.Text=从加到100值为+sum.ToString(); /将sum显式转换为字符串 该例中,首先声明一个用于存放和的变量sum,然后通过循环改变sum的值。for循环的执行过程如下:首先执行第一个表达式“int k=1;”,初始化用于循环的变量的值,需要注意的是该表达式仅执行一次。然后执行第二个表达式“k=100;”,如果该表达式的值为True,则进入循环,当循环体执行过程中遇到“continue”命令或 “”时,就结束本次循环,进行执行第三个表达式“k+;”,再次对表达式二进行判断,进入下次循环;如果该表达式的遇到“break”命令或表达式的值为False时,将结束循环。“continue”命令和“break”命令在后面讲述。本例中,共执行循环100次。在第101次时,结束循环。 上例中循环体中的语句为简单语句,同样,循环体中的语句可以为复杂语句,如下例中计算“1!+2!+n!”的值。【例5-2】使用for语句实现计算“1!+2!+n!”的值。 分析,该题中,首先要计算m!的值,然后使用上题中的方法将值累加。在这个过程中,使用两个变量sum1、sum2,用于存放计算的值。界面设计如图5-3。其中numericUpDown1控件Maxinum属性设置为1000000000。 图5-3 程序运行结果 双击button1按钮,添加相应的代码实现累加功能。代码如下。private void button1_Click(object sender, System.EventArgs e) int sum1,sum2;sum1=0;sum2=1;int n=(int)numericUpDown1.Value; /类型转换for(int k=1;k=n;k+) sum2=1; /每次求阶乘前应把sum2置为1for(int m=1;m=k;m+) sum2=sum2*m; sum1=sum1+sum2; label2.Text=1!+2!+.+n!+的值为+sum1.ToString(); 【例5-3】一农场小母牛第4年开始生一头小母牛,以后每年生一头小母牛。假设新生一头小母牛,问第10年共多少小母牛。(死亡等情况不考虑) 该问题是一个循环问题,从第4个年头开始,该小母牛每年生一头小牛,每只小牛都是这样。那么,从第4年开始,每年的母牛的总数是上面第一年和上面第3年的总和。程序设计如图5-4。 图5-4 计算母牛的总数 该题的窗体及控件设计如图5-4左图。实现代码如下。private void button1_Click(object sender, System.EventArgs e)int sum4=1;int sum1=1;int sum2=1;int sum3=1;for(int y=4;y=10;y+) sum4=sum4+sum1; sum1=sum2;sum2=sum3; sum3=sum4;label2.Text=十年后母牛的总数是+sum4.ToString();5.2 while循环语句 与for循环语句比较,while语句使用的频率要低一些,它可以用于不知道循环次数的情况;用于在循环时判断满足某个条件。每一次再循环的顶部进行检测循环是否继续,当循环的条件为假时,退出循环。5.2.1 while循环语句的语法格式 格式:while(布尔条件表达式(condition) 循环体(controlled-statement) 布尔条件表达式是每次循环开始前进行判断的条件,当条件表达式的值为真时,执行循环否则,退出循环。该语句结构的流程图如图5-5所示。图5-5 while程序流程图 说明: (1)条件表达式是一个具有Boolean值的条件表达式,为循环的条件。 (2)循环体可以是简单语句、复合语句和其他结构语句。 (3) While循环的执行过程:首先计算条件的值,如果条件为真(True),则执行后面的循环体,执行完后,再开始一个新的循环;如果条件为假(False),则终止循环,执行循环体后面的语句。 (4) 可以在循环体中的任何位置放置Break语句来强制终止While循环随时跳出While循环。Break语句通常用于If语句之后。 (5) 可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新判断条件,以决定是否开始新的循环。Continue语句通常用于If语句之后。5.2.2 while循环语句的使用【例5-4】如图5-6所示,我国古代著名的“百钱买百鸡”:每只公鸡值5元,每只母鸡值3元,三只小鸡值1元,用100元买100只鸡,问公鸡、母鸡和小鸡各买几只? 图5-6 百钱卖百鸡 设能买x只公鸡,y只母鸡,z只小鸡,本例中要解决的问题中隐含了两个方程:5*x+3*y+z/3=100;x+y+z=100。由于2个方程式中有3个未知数,属于不定方程,无法直接求解。可以用“穷举法”来进行“试根”,即将各种可能的x、y、z组合一一进行测试,将符合条件者输出即可。 该题窗体及控件的属性设计如图5-6左图。“计算”按钮的代码如下。private void button1_Click(object sender, System.EventArgs e)int x=0,y,z=0;while(x100) y=0;while(y100)z=100-x-y;if(5*x+3*y+z/3=100)listBox1.Items.Add(x.ToString()+ +y.ToString()+ +z.ToString();y+;x+;【例5-5】在【例5-3】的基础上计算多少年时会有50只小母牛。图5-7 程序运行结果 窗体及控件的属性设计如图5-7。实现代码如下。private void button1_Click(object sender, System.EventArgs e)int sum4=1;int sum1=1;int sum2=1;int sum3=1;int y=4;while(y50)label2.Text=母牛的总数多于50的是+y.ToString();break;elsey+; 该问题使用break语句跳出循环,因为当满足sum450时,是要计算的y的值。程序运行结果如图5-7。5.3 dowhile循环 dowhile循环非常类似于while循环。一般情况下,可以相互转换使用。它们之间的差别在于while循环的测试条件在每一次循环开始时执行,而dowhile循环的循环的测试条件在每一次循环体结束时进行判断。同样的,dowhile可以一些循环问题,但使用的频率较少。5.3.1 dowhile的语法格式 dowhile的一般格式:do 循环体(controlled-statement) while(布尔条件表达式(condition) 说明: (1)布尔条件表达式是一个具有Boolean值的条件表达式,为循环的条件。 (2)循环体可以是一条语句,也可以是多条语句。 (3) 循环的执行过程:首先执行循环体,然后计算条件的值,如果条件为假(False),则开始一个新的循环;如果条件为真(True),则终止循环,执行Until条件后面的语句。 (4) 可以在循环体中的任何位置放置Break语句来强制终止dowhile循环随时跳出循环。Break语句通常用于If语句之后。 (5) 可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新判断条件,以决定是否开始新的循环。Continue语句通常用于If语句之后。 该语句结构的程序流程图如图5-8。图5-8 dowhile语句的流程图 根据流程图可以看出,该循环的循环体至少执行一次。举例分析。 代码段一: 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,发现条件不成立,循环结束。5.3.2 dowhile的使用【例5-6】使用do-while语句实现1+2+3+100。 窗体及控件的属性设计见【例5-1】。代码如下。private void button1_Click(object sender, System.EventArgs e)int sum;sum=0;int k=1;dosum=sum+k;k+;while(k=100);label1.Text=从1加到100值为+sum.ToString(); /将sum显式转换为字符串5.4 列表框和组合框 C#中可为用户提供批量选项来实现选择输入的控件除了前面介绍的单选按钮和复选框外还有列表框,和组合框。在列表框中,任何时候都能看到多个项,而在组合框中,一般只能看到一个项,用鼠标单击其右侧的按钮可以看到多项的列表,可以将组合框理解成一个折叠起来的列表框。列表框与组合框还有一点不同是,列表框只能进行选择,组合框除了具有列表框的选择功能外,也可以进行键盘输入。5.4.1 列表框(ListBox) ListBox控件为用户提供了选项的列表,用户可以从列表中进行选择输入。如果项目数目超过列表框可显示的数目,控件上将自动出现滚动条,它是一种规范输入的好工具。1. 列表框的常用属性、方法和事件 表5-1列出了ListBox常用的属性,表5-2列出了ListBox常用的方法。表5-1 常用列表框属性属性说明Columnwidth指定多列列表中各列的宽度Items.Count反映列表中的项数MultiColumn设置为True时,列表框以多列形式显示项,并且会出现一个水平滚动条。SelectionMode确定一次可以选择多少列表项。SelectedIndex返回对应于列表框中第一个选定项的整数值。如果未选定任何项,则SelectedIndex值为-1。如果选定了列表中的第一项,则SelectedIndex值为0。当选定多项时,SelectedIndex值反映列表中最先出现的选定项。SelectedItem类似于SelectedIndex,但它返回项本身,通常是字符串值。表5-2 常用列表框方法方法说明Items.Add向项列表中添加项Items.Insert将项插入到列表框中指定索引处Items.Clear从集合中移除所有项Items.Remove从集合中移除指定对象 ListBox最常用的事件是SelectedIndexChanged事件,该事件在用户单击了ListBox中不同列表项时触发,即选项的索引值被改变时发生的事件。2. 列表框应用实例 【例5-7】单击程序的【开始】按钮,程序自动在列表框中添加1955年2005年的年号,单击【清除】按钮,将清除列表框中的内容。选择某一年号,程序显示该年是否闰年。程序运行结果如图5-9所示。 程序设计步骤如下: (1) 设计程序界面 新建一个C#项目,向窗体中添加2个标签控件Label1、Label2,1个列表框控件ListBox1和2个按钮控件Button1、Button2。适当调整各对象的大小及位置,程序界面如图5-10所示。 图5-9 运行结果 图5-10 设计界面 (2) 设置对象属性 设置窗体Form1的Text属性为“判断闰年”;设置Label1的Text属性为“1955年2005年:”,Label2的Text属性设置为空;设置Button1、Button2的Text属性分别为“开始”和“清除”;设置Label2的Name属性为lblOut;设置Button1、Button2的Name属性分别为btnLoad和btnClear;设置ListBox1的Name属性为lstYears。 (3) 编写程序代码 【开始】按钮被单击时执行的事件代码如下:private void btnLoad_Click(object sender, System.EventArgs e)/如果列表框不为空(已执行过开始操作且未清除),则不做任何操作if(lstYears.Items.Count!=0) return;for(int i=1955;iyearEnd) /如果选择的起始年份大于截止年份,则不执行任何操作return;lstOut.Items.Clear( ); /清除上次判断显示的内容for(int i=yearStart;i=yearEnd;i+) /按指定年份范围循环if(i%4=0&i%100!=0|i%400=0) /判断指定范围内的每一年份是否闰年lstOut.Items.Add(i); /将闰年的年份追加到列表框 【清除】按钮被单击时执行的事件代码如下:private void btnClear_Click(object sender, System.EventArgs e)lstOut.Items.Clear( ); /清空列表5.5 使用计时器控件(Timer) 计时器(Timer)控件在工具箱的图标为,它是一种无需用户干预,按一定时间间隔周期性地自动触发事件的控件。一般用来检查系统时间,判断是否该执行某项任务,也可以用于后台处理。Timer控件在程序运行时是不可见的,所以将其添加到窗体后显示在窗体设计器下方的组件窗格中。5.5.1 计时器控件的属性、方法和事件 Timer控件的主要属性、方法和事件见表5-4。表5-4 Timer控件的主要属性、方法和事件属性名称说明Enabled该属性为True时,计时器开始工作,为False时暂停。Interval该属性用来设置计时器触发的周期(以毫秒计)取值范围为064767。方法Start启动Timer控件,相当于将Enabled属性设置为TrueStop停止Timer控件,相当于将Enabled属性设置为False事件Tick计时器开始工作时由系统触发的事件,用户无法直接触发该事件5.5.2 计时器控件应用实例 【例5-9】设计一个倒计时程序,用户在“倒计时”文本框中输入倒计时的分钟数,按钮回车键,开始倒计时。程序运行结果如图5-16所示 程序设计步骤: (1) 设计程序界面 新建一个C#项目,向窗体中添加5个标签控件,3个文本框控件,1个按钮控件。适当调整各对象的大小及位置。添加两个计时器控件,这两个控件将显示在设计视图的组件栏中。 (2) 设置对象属性 各控件的Text属性值参照图5-17所示设计界面设置。 图5-16 运行结果 图5-18 设计界面 在代码设计中需要用到的控件的Name属性设置见表5-5。表5-5 各控件Name属性设置原Name属性值修改Name属性值说明label1lblTimeStart对应“当前时间”标签标题label3lblRemainder对应设计时标题为空的标签label5lblTimeEnd对应“结束时间”标签标题textBox1txtTimeStart显示当前时间及倒计时开始时间的文本框textBox2txtNumber输入倒计时分钟数textBox3txtTimeEnd显示倒计时期间的时间button1btnReset单击该按钮恢复初始状态 将txtTimeStart与txtTimeEnd文本框的只读属性设置为true。 设置两个计时器的Interval属性值为1000,即1秒钟激发一次。 (3) 编写程序代码首先在类定义开始处声明必须的变量字段如下:uint remainder; /保存倒计时的剩余总秒数uint minute; /保存倒计时剩余分钟数图5-20 添加Activated事件代码uint second; /保存倒计时剩余秒数string msg; /保存倒计时总信息 保证窗体处于选中状态,单击属性窗口的事件按钮,在事件列表中找到Activated事件,如图5-20所示。用鼠标双击该事件,添加代码以保证窗口被激活时txtNumber控件获得焦点,代码如下:private void Form1_Activated(object sender, System.EventArgs e)txtNumber.Focus( ); /输入文本框获得焦点 以同样方法添加为控件txtNumber添加KeyPress(键盘事件代码如下: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; /显示控件txtTimeEnd.Visible=true; /显示控件lblTimeStart.Text=开始时间:; /更换标签标题 双击控件timer2添加事件代码如下:private void timer2_Tick(object sender, System.EventArgs e) /在txtTimeStart文本框中显示时间txtTimeStart.Text=DateTime.Now.Hour.ToString( )+:+DateTime.Now.Minute.ToString( )+:+DateTime.Now.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=remainder%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 习题16
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!