版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 循环结构程序设计 循环结构是高级语言程序设计中一种常用的控制结循环结构是高级语言程序设计中一种常用的控制结构,主要用于解决那些需要重复处理的问题。例如,构,主要用于解决那些需要重复处理的问题。例如,输入输入100个学生的成绩、统计不及格的学生人数等。个学生的成绩、统计不及格的学生人数等。 循环结构和顺序结构、选择结构一起构成了结构化循环结构和顺序结构、选择结构一起构成了结构化程序设计的程序设计的3种基本结构,熟练掌握循环结构对程种基本结构,熟练掌握循环结构对程序设计非常重要。序设计非常重要。 本章将采用循环结构进一步完善本章将采用循环结构进一步完善“学生信息管理系学生信息管理系统统”中
2、的中的“菜单选择菜单选择”程序。程序。本章内容本章内容4.1 for语句语句4.2 while语句语句4.3 do-while语句语句4.4 break语句和语句和continue语句语句4.5 循环语句的嵌套循环语句的嵌套4.6 C语言程序的调试方法语言程序的调试方法4.7 案例分析与实现案例分析与实现【学习目标学习目标】掌握三种循环控制语句:掌握三种循环控制语句:for语句、语句、while语句和语句和do-while语句语句掌握掌握break语句和语句和continue语句语句能够熟练应用能够熟练应用for语句、语句、while语句和语句和do-while语句语句进行程序设计进行程序设计
3、 一般格式为:一般格式为:for(循环变量赋初值循环变量赋初值;条件表达式条件表达式;循环变量增值循环变量增值) 循环体循环体【格式说明】【格式说明】(1) for语句的三个表达式之间必须以分号分隔语句的三个表达式之间必须以分号分隔,如果省如果省略条件表达式,则默认条件为真。略条件表达式,则默认条件为真。(2) 循环体是一条简单语句或复合语句。循环体是一条简单语句或复合语句。(3) 循环变量赋初值部分和循环变量增值部分可以放循环变量赋初值部分和循环变量增值部分可以放在在for语句的括号之外,但分号不能省略,上述语句的括号之外,但分号不能省略,上述for语句等价于:语句等价于:循环变量赋初值循环
4、变量赋初值for(;条件表达式;条件表达式;) 循环体循环体循环变量增值循环变量增值【例例4-14-1】编写程序求编写程序求1+2+3+1001+2+3+100的和。的和。 #include void main() int sum=0,i; for(i=1;i=100;i+) sum=sum+i; printf(sum=%dn,sum); 问题:问题:1)如果求从)如果求从1到到100之间的所有奇数之和,之间的所有奇数之和,上面的程序应如何修改?上面的程序应如何修改? 2)for循环执行完后,循环执行完后,i的值为多少?的值为多少?【例例4-2】 编程输出编程输出1200之间所有用之间所有用3
5、除余除余2、且、且用用5除余除余3的数,并统计这样的数有多少个。的数,并统计这样的数有多少个。编程思路:可以采用穷举法来编程实现。编程思路:可以采用穷举法来编程实现。#include void main() int i,k=0; /k用来计数用来计数for(i=1;i=200;i+)if(i%3=2) & (i%5=3)printf(%4d,i);k+;printf(n数的个数为:数的个数为:%dn,k);【例例4-3】鸡兔同笼问题。已知笼中鸡和兔共鸡兔同笼问题。已知笼中鸡和兔共100只,只,共有共有274只脚,求鸡和兔各有多少只?只脚,求鸡和兔各有多少只?编程思路:可以采用穷举法来编
6、程实现。编程思路:可以采用穷举法来编程实现。#include void main()int a,b;/a和和b分别表示鸡和兔的数量分别表示鸡和兔的数量for(a=1;a100;a+)b=100-a;if(a*2+b*4=274) printf(鸡有:鸡有:%d只,兔有:只,兔有:%d只只n,a,b);#include #include void main()double sum=0,pi,c; /c为当前项为当前项int n; /n为循环控制变量为循环控制变量for (n=1;n=100;n+)c=pow(-1,n+1)/(2*n-1); /计算当前项计算当前项sum=sum+c;/求和求和p
7、i=4*sum;printf(pi=%lfn,pi);程序改进程序改进该程序该程序100次调用数学函数次调用数学函数pow(),会带来一定的开,会带来一定的开销,影响程序的执行速度,能否采用其他方式来控制销,影响程序的执行速度,能否采用其他方式来控制每一项的符号位呢?方法如下:每一项的符号位呢?方法如下:(1) 定义一个表示符号位的变量定义一个表示符号位的变量s,语句为:,语句为:double s=1;。(2) 由于符号位正负交替,因此,每执行一次就将由于符号位正负交替,因此,每执行一次就将符号位取反,这样可将语句符号位取反,这样可将语句c=pow(-1,n+1)/(2*n-1);改为:改为:
8、c=s/(2*n-1); s=-s;。【例例4-5】 输出所有水仙花数。所谓水仙花数是输出所有水仙花数。所谓水仙花数是指一个指一个3位数,其各位数字的立方和等于该数本位数,其各位数字的立方和等于该数本身。例:身。例:15313+53+33#include void main()int m,bai,shi,ge;/bai、shi、ge分别对应百、十和个位分别对应百、十和个位for(m=100;m=999;m+) bai=m/100;shi=(m%100)/10; ge=m%10; if(m=bai*bai*bai+shi*shi*shi+ge*ge*ge)printf(%d ,m); 如何统计这
9、样的数有多少个?如何统计这样的数有多少个?【例例4-6】有一数列有一数列2、3、5、8、,从第,从第3项项开始,每一项为其前两项之和,输出这个数列的开始,每一项为其前两项之和,输出这个数列的前前20项,且每行显示项,且每行显示5个数。个数。 #include #include void main()void main() int i,a1=2,a2=3,a3;int i,a1=2,a2=3,a3;printf(%6d%6d,a1,a2);printf(%6d%6d,a1,a2);for(i=3;i=20;i+)for(i=3;i=20;i+) a3=a1+a2;a3=a1+a2;printf(
10、%6d,a3);printf(%6d,a3);a1=a2;a1=a2;a2=a3;a2=a3;if(i%5=0)if(i%5=0)printf(n);printf(n); 编程思路:编程思路:这是一个典型的递推问题。这是一个典型的递推问题。 4.2 while语句语句whilewhile语句又叫语句又叫“当当”语句,其一般格式为:语句,其一般格式为:whilewhile(条件表达式)(条件表达式)循环体循环体 【例例4-74-7】编写程序求编写程序求1+2+3+1001+2+3+100的和。的和。 #include void main()int sum=0,i=1;while(i=100)su
11、m=sum+i;i=i+1;printf(sum=%dn,sum);【程序说明程序说明】(1) 一定要在一定要在while循环之前给变量循环之前给变量sum和和i赋初值,否则,赋初值,否则,变量的值为一个随机数,会导致程序的执行结果不正确。变量的值为一个随机数,会导致程序的执行结果不正确。(2) 由于循环体由两条语句构成,因此,必须用由于循环体由两条语句构成,因此,必须用 将他们将他们括起来。括起来。【例例4-84-8】小红今年小红今年1212岁,她父亲比她大岁,她父亲比她大3030岁,编程计岁,编程计算:多少年后她父亲的年龄是她的年龄的算:多少年后她父亲的年龄是她的年龄的2 2倍倍 ,此时,
12、此时她的年龄是多少?她的年龄是多少? #include void main ()int x=12,y=42,m;while(2*x!=y)x+;y+;m=x-12;printf(经过的年数:经过的年数:%d,小红的年龄:,小红的年龄:%d,小红父亲的年龄:小红父亲的年龄:%d n,m,x,y);#include #include void main()double sum=0,pi,c=1,s=1; /c为当前项,为当前项,s为符号位为符号位int n=1;while (fabs(c)=1e-6)sum=sum+c;s=-s;n+;c=s/(2*n-1);pi=4*sum;printf(pi=
13、%lfn,pi); 用用while语句编写的程序一般也可以采用语句编写的程序一般也可以采用for语句语句来实现,那么什么情况下更适合采用来实现,那么什么情况下更适合采用for语句语句? 什什么情况下更适合采用么情况下更适合采用while语句呢?语句呢? 答案是:答案是:for语句最适合编写循环次数事先已经知语句最适合编写循环次数事先已经知道的循环。对于循环次数事先不能确定的情况,道的循环。对于循环次数事先不能确定的情况,采用采用while语句实现起来会更方便。语句实现起来会更方便。 do-whiledo-while语句又叫语句又叫“直到型直到型”循环语句,循环语句,其一其一般格式为:般格式为:
14、do 循环体循环体while(条件表达式)(条件表达式); 【例例4-104-10】编写程序求编写程序求1+2+3+1001+2+3+100的和。的和。 #include void main()int sum=0,i=1;dosum=sum+i;i=i+1; while(i=100);printf(sum=%dn,sum); while语句和语句和do-while语句的区别语句的区别(1) do-while语句是先执行,再判断;而语句是先执行,再判断;而while语语句是先判断,再执行。句是先判断,再执行。(2) do-while语句中循环体至少执行一次;而语句中循环体至少执行一次;而whil
15、e语句中,如果第一次判断时条件就不成立,则语句中,如果第一次判断时条件就不成立,则循环体一次也不会执行。循环体一次也不会执行。对于先执行,再判断的应用场合,采用对于先执行,再判断的应用场合,采用do-while语句实现起来更方便。语句实现起来更方便。【例例4-114-11】编写一个口令输入程序,让用户输入口令,编写一个口令输入程序,让用户输入口令,直至输对为止。假设口令为直至输对为止。假设口令为100100。要求分别采用。要求分别采用do do whilewhile和和whilewhile两种循环语句来实现。两种循环语句来实现。#include void main()int pwd;print
16、f(请输入口令请输入口令:);scanf(%d,&pwd);while(pwd!=100)printf(请输入口令请输入口令:);scanf(%d,&pwd);printf(口令正确!口令正确!); #include void main()int pwd;doprintf(请输入口令请输入口令:);scanf(%d,&pwd);while(pwd!=100);printf(口令正确!口令正确!); 前面介绍的例子都是执行到循环条件不成立时才前面介绍的例子都是执行到循环条件不成立时才正常退出循环,但在实际应用中有时需要提前结束循正常退出循环,但在实际应用中有时需要提前结束
17、循环,这时就可以用环,这时就可以用breakbreak语句或语句或continuecontinue语句。语句。4.5.1 break语句语句【例例4-12】从键盘输入一个正整数,判断该数是从键盘输入一个正整数,判断该数是否为素数。否为素数。 #includevoid main() int i,m;scanf(%d,&m);for(i=2;im-1)printf(%d是素数是素数n,m);elseprintf(%d不是素数不是素数n,m);素数定义:素数定义:除了除了1和自身外不能被其它自然数整除的数。和自身外不能被其它自然数整除的数。 问题:问题:数学上已经证明:只数学上已经证明:只要
18、要m不被不被2 之间的之间的数整除,它就是素数。数整除,它就是素数。根据这一原理,上述程根据这一原理,上述程序应如何改进?序应如何改进? m【例例4-13】从键盘输入两个正整数从键盘输入两个正整数m和和n,求他们,求他们的最大公约数。的最大公约数。根据最大公约数的定义,最大公约数应该在根据最大公约数的定义,最大公约数应该在1m(或或n)之间,因之间,因为是求最大的公约数,所以从大往小求。为是求最大的公约数,所以从大往小求。#includevoid main()int i,m,n;scanf(%d%d,&m,&n);for(i=m;i=1;i-)if(m%i=0 & n%
19、i=0)break;printf(最大公约数:最大公约数:%dn,i);4.5.2 continue语句语句不终止整个循环操作,而只是提前结束本次循环,不终止整个循环操作,而只是提前结束本次循环,接着执行下次循环。接着执行下次循环。 【例例4-14】输出输出100以内不能被以内不能被3整除的自然数。整除的自然数。 #includevoid main() int i;for(i=1;i=100;i+)if(i%3=0)continue;printf(%d ,i);如果一个循环语句的循环体中又包含有另如果一个循环语句的循环体中又包含有另一个完整的循环语句就叫做嵌套循环。一个完整的循环语句就叫做嵌套
20、循环。 【例例4-15】输出输出100到到200之间的所有素数。之间的所有素数。 #includevoid main() int i,m;for(m=100;m=200;m+)for(i=2;im-1)printf(%5d,m);【例例4-16】数学史上有一个著名的百钱买百鸡问题。已数学史上有一个著名的百钱买百鸡问题。已知公鸡一只知公鸡一只5元,母鸡一只元,母鸡一只3元,小鸡元,小鸡3只只1元,用元,用100元元钱买钱买100只鸡,问公鸡、母鸡和小鸡各买多少只鸡,问公鸡、母鸡和小鸡各买多少? #include void main()int a,b,c; /a、b、c分别表示公鸡、母鸡和小鸡的数
21、量分别表示公鸡、母鸡和小鸡的数量for(a=0;a=19; a+)for(b=0;b=33;b+)c=100-a-b;if(5*a+3*b+c/3=100 & c%3=0)printf(公鸡:公鸡:%d,母鸡:,母鸡:%d,小鸡:,小鸡:%dn, a,b,c);【例例4-17】采用对个位、十位、百位进行穷举的采用对个位、十位、百位进行穷举的方法输出所有水仙花数。方法输出所有水仙花数。#include void main(void) int i,j,k; for(i=1;i10;i+) for(j=0;j10;j+) for(k=0;k10;k+) if( (i*100+j*10+k)=
22、(i*i*i)+(j*j*j)+(k*k*k) printf(%d%d%d ,i,j,k); 【例例4-18】从键盘输入一个数从键盘输入一个数n,求,求1!+2!+n!。!。 #include void main()int i,j,n;long p,sum=0; /p保存阶乘,保存阶乘,sum保存累加和保存累加和scanf(%d,&n); /输入输入nfor(i=1;i=n;i+)/各阶乘累加各阶乘累加p=1;for(j=1;j=i;j+)/求求i!p=p*j;sum=sum+p;printf(计算结果为:计算结果为:%dn,sum); 4.6 C语言程序的调试方法语言程序的调试方法程
23、序错误总体上有两类:程序错误总体上有两类:语法错误语法错误和和逻辑错误逻辑错误。对于语法错误,编译时会产生错误提示信息,可对于语法错误,编译时会产生错误提示信息,可以根据错误提示信息加以修改。以根据错误提示信息加以修改。如果程序编译、连接都没有错误,但运行结果与如果程序编译、连接都没有错误,但运行结果与预期结果不一致,则需要通过调试来找出程序中存预期结果不一致,则需要通过调试来找出程序中存在的逻辑错误,并加以排除。在的逻辑错误,并加以排除。调试是一个程序员必须掌握的基本技巧,对于编调试是一个程序员必须掌握的基本技巧,对于编写大型程序非常重要。写大型程序非常重要。调试可以借助调试可以借助“调试工
24、具条调试工具条(Debug)”来进行,来进行,“调试工调试工具条具条”中的主要命令如图中的主要命令如图4-7所示。所示。如果如果VC 6.0工具栏上没有显示工具栏上没有显示“调试工具条调试工具条”命令按钮命令按钮,则可在菜单栏空白处右击,选中,则可在菜单栏空白处右击,选中“调试调试(Debug)” 。C语言的调试手段主要有:语言的调试手段主要有:单步执行单步执行、运行到光标处运行到光标处和和设置断点设置断点,这三种调试手段在实践中常常结合使用。,这三种调试手段在实践中常常结合使用。1. 单步执行单步执行(Step Over)单击单击“单步执行单步执行(Step Over)”按钮一次,程序执行一
25、步按钮一次,程序执行一步 查看程序中变量的值查看程序中变量的值程序执行的每一步都可以通过以下几种方式程序执行的每一步都可以通过以下几种方式来查看程序中变量的值,检查程序的执行情况。来查看程序中变量的值,检查程序的执行情况。把光标移动到某个变量上,停留一会就可以看到把光标移动到某个变量上,停留一会就可以看到该变量的值。该变量的值。在窗口的左下方,会自动显示变量的值。在窗口的左下方,会自动显示变量的值。在窗口右下方的观察窗口中输入变量名,会显示在窗口右下方的观察窗口中输入变量名,会显示该变量的值。该变量的值。2. 运行到光标处运行到光标处(Run to Cursor)先在源程序中定位好光标的位置,
26、再单击工具栏先在源程序中定位好光标的位置,再单击工具栏上的上的Run to Cursor按钮,程序将直接运行到光标按钮,程序将直接运行到光标所在的行,然后暂停,接下来可以通过单步执行等所在的行,然后暂停,接下来可以通过单步执行等方式继续调试。方式继续调试。3. 插入断点插入断点(Insert Breakpoint)如果想要程序每次执行到某一行时都自动暂如果想要程序每次执行到某一行时都自动暂停,以便判断程序是否有错,则可以将该行设置为停,以便判断程序是否有错,则可以将该行设置为“断点断点”。 设置断点的方法是:先把光标移动到需要设置断点的程设置断点的方法是:先把光标移动到需要设置断点的程序行,然
27、后单击工具栏上的序行,然后单击工具栏上的Insert Breakpoint按钮。按钮。 设置断点后,单击工具栏上的设置断点后,单击工具栏上的Go按钮,运行至断点。按钮,运行至断点。表表4-1常用的调试命令及其含义常用的调试命令及其含义命令名称命令名称命令含义命令含义Step OverStep Over单步执行。如果当前语句中有函数调用,单步执行。如果当前语句中有函数调用,则不进入被调用函数,直接将当前语句执则不进入被调用函数,直接将当前语句执行完。行完。Stop DebuggingStop Debugging停止调试。停止调试。Run to CursorRun to Cursor运行到光标处,需要先在源程序中定位好运行到光标处,需要先在源程序中定位好光标的位置。光标的位置。Insert/Remove Insert/Remove BreakpointBreakpoint插入或删除断点。插入或删除断点。GoGo运行程序至断点,需要先设置好断点。如运行程序至断
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年房产投资项目评估合同
- 2024年度广告宣传代理合同
- 2024年度技术开发合作合同补充协议
- 2024年房产增值分配补充协议
- 2024年航空辅助动力系统项目综合评估报告
- 2024年度X集团网络安全培训服务合同
- 大班个人成长计划(3篇)
- 2024销售人员的工作总结(28篇)
- 2024年产品分销合同
- 2024年度安置房买卖合同中的房屋保险购买
- 10000中国普通人名大全
- 铣削深搅水泥土搅拌墙技术规程-中国土木工程学会
- 仓库租赁合同电子版
- 倪海厦人纪之针灸 全
- 《学前教育专业导论》课程教学大纲
- 小腿免荷支具矫形器制作流程【培训课件】
- DB11-T 1863-2021医疗机构保洁服务规范
- 项目建设全过程管理经典讲义(PPT)
- 电梯维修维保方案
- 脑心综合征课件
- 中国大唐集团公司纪检监察部门问题线索管理办法
评论
0/150
提交评论