《第6章程序的控制结构2循环》由会员分享,可在线阅读,更多相关《第6章程序的控制结构2循环(45页珍藏版)》请在金锄头文库上搜索。
1、脏役放鹰朗牛昧佬帕杖沽稳痉土活晶报侈湘木焙潍菜轧潞聘秤苏陨胡室呜第6章程序的控制结构2循环第6章程序的控制结构2循环第第第第6 6 6 6章章章章 程序的控制结构程序的控制结构程序的控制结构程序的控制结构(2)(2)(2)(2)循环循环循环循环西南财经大学王磊惩着洪屉雄奎擒诀煎英邯淄姥吐弥恃牟必卵歪畦捞碘缀怖渗社箭孟版甭还第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202426.16.1循环结构循环结构循环结构循环结构P循环体YN当当P为真为真循环体循环体P循环体YN当当P为真为真循环体循环体当型循环当型循环两种形式两种形式P循环体NY直到直到P为真为真循环体循环体P循环体Y
2、直到直到P为真为真循环体循环体直到型循环直到型循环两种形式两种形式N煮门乳蚂壮滦艘俱潘化斟隅谣代摹蚀掳煤肛私绎杖混贱导缸伯级揍恼恃积第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/20243循环循环循环循环whilewhile语句,语句,语句,语句,forfor语句语句语句语句while(表达式表达式) 循环语句循环语句; do 循环语句循环语句; while(表达式表达式);for(表达式表达式1; 表达式表达式2; 表达式表达式3) 循环语句循环语句; 聘毙报鸣牺华咸搂童械惜悼压幌倡闪弃窑戊鸳泄效业烈凰研苔肺翠赎晓肄第6章程序的控制结构2循环第6章程序的控制结构2循环7/25
3、/20244whilewhile语句语句语句语句while (表达式表达式) 循环语句循环语句; 只要只要表达式表达式的值为的值为非非0(真真),就重复执行就重复执行while循环循环语句语句,直到直到表达式表达式值为值为0(假假)时止时止P循环体YN均硼乔践瑰烙骇论戌杠画上文栅淡活刊迢素镇掉糊赊弗氦证畏镜鸡车煤溪第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/20245dodo- -whilewhile语句语句语句语句do 循环循环语句语句语句语句; ; whilewhile ( (表达式表达式表达式表达式);); 首先执行首先执行首先执行首先执行语句语句语句语句,然后判断,然
4、后判断,然后判断,然后判断表达式表达式表达式表达式的值。的值。的值。的值。 如果表达式为如果表达式为如果表达式为如果表达式为0 0,结束,结束,结束,结束whilewhile循环语句。循环语句。循环语句。循环语句。否则,再次执行否则,再次执行否则,再次执行否则,再次执行循环循环循环循环语句。语句。语句。语句。 语句语句语句语句会被至少执行一次会被至少执行一次会被至少执行一次会被至少执行一次P循环体YN靖流痘兑奎崔魁嚏底旨垛央始枣剁读挺鄙惫位桨生畴戏稿梳滁忿擂候可拒第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/20246forfor语句语句语句语句for (表达式表达式1; 表达
5、式表达式2; 表达式表达式3) 循环语句循环语句; 循环起始条件循环起始条件(通常对循环(通常对循环变量赋初值)变量赋初值)循环结束条件循环结束条件(每次执行循环每次执行循环语句前需判断语句前需判断)循环增量循环增量(循环语句执行完(循环语句执行完一次后计算表达式一次后计算表达式3的值)的值)(1) 计算计算表达式表达式1,(2)计算计算表达式表达式2。若。若表达式表达式2的值的值 0(不满足结束条件)(不满足结束条件), 则执行循环语句则执行循环语句, 若若表达式表达式2的值的值=0,则结束循环;,则结束循环;(3)执行执行循环语句循环语句;(3) 计算计算表达式表达式3, 再次判断表达式再
6、次判断表达式2的值的值.依此重复下去依此重复下去,直到直到表达式表达式2的值的值=0(假假)。仑但秸斩辛闷逸血遏溪贩卑闲芹匿框嘲纽墨蒜冲溉望竭庚藏免盏劈拣挚瞳第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/20247注意注意注意注意 循环变量循环变量循环变量循环变量的使用的使用的使用的使用通过通过循环变量循环变量i i 的值的值的值的值来控制循环次数。来控制循环次数。来控制循环次数。来控制循环次数。 ForFor循环的循环的循环的循环的循环总次数循环总次数循环总次数循环总次数是是是是已知的已知的已知的已知的。for ( i=1; i=100; i+) sum+=i;秃躬嘘枉尖纵招
7、苑雄递恬污严孪卫捷纠撩扫遍吵篱商辞薯柄涸刽内壕几饵第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/20248forfor语句语句语句语句for (表达式表达式1; 表达式表达式2; 表达式表达式3) 循环语句循环语句; 相当于:相当于:表达式表达式1和和表达式表达式3可以没有或者是用逗号分隔的多可以没有或者是用逗号分隔的多个表达式的组合个表达式的组合。但最好不要有太多的表达式组合。但最好不要有太多的表达式组合 表达式表达式表达式表达式1;1; whilewhile ( (表达式表达式表达式表达式2)2) 循环语句循环语句循环语句循环语句; ;表达式表达式表达式表达式3;3; 众笺
8、搓钎珐八臂李而姥孰科咕挠橡丸蔼颅受派俊榔宋拂菩耍沾涟棍渺互毫第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/20249选择三种循环的一般原则选择三种循环的一般原则选择三种循环的一般原则选择三种循环的一般原则如果循环次数已知,用如果循环次数已知,用for如果循环次数未知,用如果循环次数未知,用while如果循环体至少要执行一次,用如果循环体至少要执行一次,用do-while这只是这只是“一般一般”原则,不是原则,不是“原则原则”虚岳蘸舔嗅帧掺舔霓派程洪优芭遵增息稻邮圾半移氨纫涨戒峪坡沫琳豪吟第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202410注意注意注意注意在
9、在for和和while语句之后一般没有分号语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)有分号表示循环体就是分号之前的内容(空循环体)while (i 100);i+;for (i = 0; i 100; i+);printf(%d, i);for通常有一个循环变量控制循环的次数,不要在循通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量环体内改变这个变量违袱团拽举粱球毋衔霖瞥膀玛戌租肃怔赛终现篮炯墓屋挎伍踊咀傲躯嵌耻第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202411例:计算例:计算例:计算例:计算 n!=12n n!=12n分别用如下语句
10、编程分别用如下语句编程forforwhilewhiledo-whiledo-while甄拒龟投舔都彦境隘靖嘱陷钎舟组撞峰剧袁蕾籽玻揣图茁杖翌盛咒背循刽第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202412循环次数已知,首先考虑用循环次数已知,首先考虑用for循环语句循环语句#include #include main()main() int i, n; int i, n; /* i/* i是循环变量是循环变量是循环变量是循环变量*/*/ long p=1; long p=1; /* /* 存放阶乘的值存放阶乘的值存放阶乘的值存放阶乘的值 */ */ printf(Pleas
11、e enter n:); printf(Please enter n:); scanf(%d,&n); scanf(%d,&n); for(i=1; i=n; i+)for(i=1; i=n; i+) p=p*i; p=p*i; printf(%d!=%ldn,n,p); printf(%d!=%ldn,n,p); 例:计算例:计算例:计算例:计算 n!=12n n!=12n纠假灿如锹菩窿茁骏喧慌宽痴遥绣骂笔兰敌经讣觉租列润蘸脸它障男俗振第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202413例:计算例:计算例:计算例:计算 n!=12n n!=12nWhile循环语句实现循
12、环语句实现int i=1;int i=1;while (i=n)while (i=n) p=p*i;p=p*i;i+;i+; do whiledo while循环语句实现循环语句实现循环语句实现循环语句实现int i=1;int i=1;dodop=p*i;p=p*i;i+;i+;while (i=n);while (i=n);渔漫倾贵酸威跋崖绰励胁筐问睫嘴萝狙追核怎圣歧玲帐石靠二层桔巩咀羽第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202414只猜1次直到猜对为止最多猜10次例:循环控制语句例:循环控制语句例:循环控制语句例:循环控制语句猜数游猜数游猜数游猜数游戏戏戏戏狱船
13、举货伍呵谚乓嫁少抑铰擦喜车悟急诞舟张偿施乒洞费颖幂熬社并蝎杏第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202415猜数游戏用到的库函数猜数游戏用到的库函数猜数游戏用到的库函数猜数游戏用到的库函数怎样模拟计算机怎样模拟计算机“想想”一个数呢?一个数呢?随机函数随机函数rand()产生产生0,RAND_MAX 之间的随机数之间的随机数 magic = rand(); #include #include RAND_MAXRAND_MAX在在在在stdlib.hstdlib.h中定义,不大于双字节整数中定义,不大于双字节整数中定义,不大于双字节整数中定义,不大于双字节整数的最大值的
14、最大值的最大值的最大值32767 32767 产生产生产生产生0,b-1 0,b-1 之间的随机数之间的随机数之间的随机数之间的随机数magic = rand()%b;magic = rand()%b; 产生产生产生产生a,a+b-1 a,a+b-1 之间的随机数之间的随机数之间的随机数之间的随机数magic = rand()%b + a; magic = rand()%b + a; 捌脆扰漆谈捻臃响纷子截具殿玫砌汽弓嘲滴请殖赂创狼止逊锤溉笔烹月淀第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202416例例例例#include #include main() int magi
15、c; /*计算机计算机想想的数的数*/int guess; /*人猜的数人猜的数*/magic = rand()%100 + 1; /*“想想”一个一个1,100100之间的之间的之间的之间的数数数数magic*/magic*/printf(Please guess a magic number:);printf(Please guess a magic number:);scanf(%d, &guess); scanf(%d, &guess); ifif (guess magic) (guess magic) printf(Wrong! Too high!n); printf(Wrong!
16、Too high!n); else ifelse if (guess magic) (guess magic) printf(Wrong! Too low!n); printf(Wrong! Too low!n); elseelse printf(Right! n); printf(Right! n); printf(The number is:%d n, magic); printf(The number is:%d n, magic); 只猜1次苏氰钝梳壮拳但霹扩杭部引者点蛛淤曹普绒估券滚骚击迂宽筹吐腾严铭统第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202417例例例例
17、#include #include main() int magic; int guess; int counter; /*记录人猜次数的计数器变量记录人猜次数的计数器变量*/magic = rand() % 100 + 1; counter = 0; /*计数器变量计数器变量count初始化为初始化为0, 统计猜测次数统计猜测次数*/doprintf(Please guess a magic number:);scanf(%d, &guess); counter +; /*计数器变量计数器变量count加加1*/if (guess magic) printf(Wrong! Too high!
18、n);else if (guess magic) printf(Wrong! Too low!n);while (guess != magic); printf(Right!n); printf(counter = %d n, counter); 直到猜对为止饥承毗肩养索锄今看忻括牡拥尧需堰捆芹族决狠装额虹狐椿德戏鸟瓤稻炸第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202418#include #include #include main() int magic; int guess; int counter; srand(time(NULL); magic = rand()
19、 % 100 + 1; counter = 0; doprintf(Please guess a magic number:);scanf(%d, &guess); counter +; if (guess magic) printf(Wrong! Too high!n);else if (guess magic) printf(Wrong! Too low!n);elseelseprintf(Right!n);printf(Right!n); whilewhile (guess != magic) (guess != magic) & (counter 10)& (counter 10);
20、); printf(counter = %d n, counter); printf(counter = %d n, counter); 实验实验实验实验3 3最多猜10次尝模俱亿仰磋蠢钵斋宛试纽郝串顶晰条钞几空聪炼氦当显浚屁劣檬巍清岭第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/2024196.3 6.3 嵌套循环嵌套循环嵌套循环嵌套循环While循环语句的嵌套;循环语句的嵌套; while ( ) while ( ) for ( ; ; ) while ( ) do while ( ); 宫尚淖尺裂荤容咯悯嘴卢履禄攒戈浓跺睦彩诈蹭愚探炽巩伤扦揩晒钡颂赁第6章程序的控制结构2
21、循环第6章程序的控制结构2循环7/25/202420使用嵌套的循环体时,应注意以下问题使用嵌套的循环体时,应注意以下问题使用嵌套的循环体时,应注意以下问题使用嵌套的循环体时,应注意以下问题 在嵌套的各层循环体中,在嵌套的各层循环体中,使用复合语句使用复合语句(即用一对大(即用一对大花括号将循环体语句括起来)花括号将循环体语句括起来)保证逻辑上的正确性保证逻辑上的正确性 内层和外层循环控制变量不应同名内层和外层循环控制变量不应同名,以免造成混乱,以免造成混乱 嵌套的循环最好采用嵌套的循环最好采用右缩进格式书写右缩进格式书写,以保证层次的,以保证层次的清晰性清晰性 代码风格问题代码风格问题循环嵌套
22、不能交叉循环嵌套不能交叉,即在一个循环体内必须完整的包,即在一个循环体内必须完整的包含着另一个循环含着另一个循环 弹贝壶歪滩桶醇卸根聚淑枯掠审门帜鞭椽左则锈寄焦脸捎限款蹬纹弯或缚第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202421例:打印例:打印例:打印例:打印乘法九九表乘法九九表乘法九九表乘法九九表 姑此封菇拔宣立即乘国冉状匿截烦蛆谬蝶谍谤煌婶氨昼秤阮煞眺觉胀巨搭第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202422例例例例#include main() int m, n; for (m=1; m10; m+) printf(%4d, m); /*打
23、印表头打印表头*/ printf(n); for (m=1; m10; m+) printf( -); printf(n); for (n=1; n10; n+) for (m=1; m10; m+)printf(%4d, n * m); printf(n); 贼滤伊搏良虱诗噶呜幂氰几憾欠惨禽卷撰绦隅醚坷秦构俗涕锻巩频奋晚谗第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202423例:打印下三角例:打印下三角例:打印下三角例:打印下三角乘法九九表乘法九九表乘法九九表乘法九九表 蹋悟旦筛隋鼎魁枢拙磐许敏起畔几稗滤日心蒂仗成疾呜判是鹤歹朋蓟暖帐第6章程序的控制结构2循环第6章程序的
24、控制结构2循环7/25/202424#include main() int m, n; for (m=1; m10; m+) printf(%4d, m); /*打印表头打印表头*/ printf(n); for (m=1; m10; m+) printf( -); printf(n); for (m=1; m10; m+) for (n=1; n=m; n+)printf(%4d, m * n); printf(n); 例例例例托区精屹根帕庭悄锄疹琴眶戒傍仇搽跑天穷股搔咐遍断槛缸斧循淬禽厨穆第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/2024256.5 6.5 流程的转移控
25、制流程的转移控制流程的转移控制流程的转移控制 break语句语句continue语句语句goto语句语句渔些疥细萄吩喀阎叛莎晌侨现梭关姐篷戮吱堆碟裔占艇遥匙幻膛蹬奸戴碍第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202426breakbreak和和和和continuecontinuebreak语句语句:退出循环结构语句退出循环结构语句或者或者switch如果是嵌套循环,则只退出如果是嵌套循环,则只退出break语句所在的循环。语句所在的循环。 continuecontinue:中断本次循环体的执行过程,并进行循环的下一轮中断本次循环体的执行过程,并进行循环的下一轮中断本次循环
26、体的执行过程,并进行循环的下一轮中断本次循环体的执行过程,并进行循环的下一轮 breakbreak和和和和continuecontinue少用为妙少用为妙少用为妙少用为妙吠耙纫韧精扁甚孟掩暗溺辣鼎吨吓赖斟乃坏铝累副舰胃屿障造缮拆居兢它第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202427breakbreak和和和和continuecontinue假假真真break表达式1表达式2循环语句后循环语句后的下一条语句循环语句后的下一条语句假假真真 表达式1表达式2continue遂熙郡岗缔象欧旬击庶柳辑敞朗养茁辗靡候荫抢礁扮禹胺故句砰嫩暇砷蔚第6章程序的控制结构2循环第6章程序的
27、控制结构2循环7/25/202428例:单步运行演示例:单步运行演示例:单步运行演示例:单步运行演示breakbreak语句和语句和语句和语句和continuecontinue语句的用法区别语句的用法区别语句的用法区别语句的用法区别#include main()int i, n;for (i=1; i=5; i+)printf(Please enter n:);scanf(%d, &n);if (n 0) break;printf(n = %dn, n);printf(Program is over!n);Please enter n:10 n = 10Please enter n: -10
28、Program is over!巳占谓由岔揩钎德坟邻擞暗啼避灿疙片亲腺层卷吭饺匪盟单蒋女梨扦桓疽第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202429例例例例 :单步运行演示:单步运行演示:单步运行演示:单步运行演示breakbreak语句和语句和语句和语句和continuecontinue语句的用法区别语句的用法区别语句的用法区别语句的用法区别#include main()int i, n;for (i=1; i=5; i+)printf(Please enter n:);scanf(%d, &n);if (n 0) continue;printf(n = %dn, n)
29、;printf(Program is over!n);Please enter n: 10 n = 10Please enter n: -10 Please enter n: 20 n = 20Please enter n: -20 Please enter n: 30 n = 30Program is over! 侵磐迷谱佩候短踊胖帝辣萌巧鼎阿廓埋骤鱼佐釉内舆佐鸭你村慈抄鹰肯菩第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202430标号举例标号举例error: printf(“Errors!, exit!n” ); GotoGoto语句语句语句语句举例举例举例举例 goto
30、 goto error; error; 一般形式一般形式一般形式一般形式 语句标号:语句标号:语句标号:语句标号: goto goto 语句标号语句标号语句标号语句标号; ;gotogoto与标号(与标号(与标号(与标号(labellabel)及澜沫理谴婉黍啮炼稿匿揍陀淑续破住煎横龄逾歹肮味三犬伙柏夺讫逻综第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202431是是是是gotogoto的过错?还是程序员的过错?的过错?还是程序员的过错?的过错?还是程序员的过错?的过错?还是程序员的过错?破坏了结构化设计风格破坏了结构化设计风格容易带来错误隐患容易带来错误隐患如非必需,尽量不用
31、如非必需,尽量不用gotomain()main() int sum; int sum; goto goto nextnext; ; sum=0; sum=0; /*/*被被被被gotogoto跳过跳过跳过跳过*/*/next:next: printf(%d, sum); printf(%d, sum); 士肄齐淑邢秧泉烫紊叼角弹颁浦词沟怂灌揩薯今疥妆爪知袱寞椒枫绅龚擅第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202432其他流程转移控制其他流程转移控制其他流程转移控制其他流程转移控制标准库函数标准库函数exit() 作用是作用是终止整个程序的执行终止整个程序的执行,强制返回
32、操作系统,强制返回操作系统 调用该函数需要嵌入头文件调用该函数需要嵌入头文件用法:用法: exit(code);code参数设置(惯例):参数设置(惯例): 0 表示程序正常退出;表示程序正常退出; 非非0 表示程序出现某种错误退出。表示程序出现某种错误退出。观窗谣厕卫奶擦俄托娶勾擞逮冕马欠裹拍岔扶闭怀沈恶祁翠纶丹宰豺婆幅第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202433例题分析:素数问题例题分析:素数问题例题分析:素数问题例题分析:素数问题给给定一个正整数定一个正整数n=91,判断它是不是素数。判断它是不是素数。判断判断标标准:准: 素数只能被自身和素数只能被自身和1
33、整除。例如,整除。例如,91%1=0, 91%91=0. 思路:思路:思路:思路:将将将将2 2至至至至n-1n-1之之之之间间间间的所有整数,同的所有整数,同的所有整数,同的所有整数,同n n进进进进行求余操作,判断余行求余操作,判断余行求余操作,判断余行求余操作,判断余数是否数是否数是否数是否为为为为0 0, 如果如果如果如果发现发现发现发现任意一次任意一次任意一次任意一次为为为为0 0,则则则则n n必然不是素必然不是素必然不是素必然不是素数。数。数。数。循循循循环语环语环语环语句。句。句。句。逝雅缄菏糜侨脐狭瓢跪幕瘸政沧诫耍漂晨龋壶匀奥额乙船乳乏忻屋戮题粹第6章程序的控制结构2循环第6
34、章程序的控制结构2循环7/25/202434程序结构程序结构程序结构程序结构int main( ) /定定义变义变量、初始化量、初始化 / 进进行行计计算、算、处处理理 / 输输出出结结果果 阎仪颂陀泳知还蔼涤麓扶严姐泣弃傅冀内炙艳咖郁翠承嚷侗辊涅吐除澡佐第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202435int main( )int n=91;int x; /循循环变环变量量int count=0; /用于用于统计统计n被整除的次数被整除的次数for(x=2; x0) printf(“n不是是素数不是是素数);else printf(n是素数是素数); return 0
35、;冲淆吻碘添鞋柄口搔酱膝着现淤攫蛙躇夏摘未竿氯称蚤痔攫狸钉湍繁庞简第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202436思考思考思考思考1 1:目的:目的: 假假设设判断是否能判断是否能够够整除(整除(n%x= =0)的)的计计算开算开销销很大,程序很大,程序应该应该尽量减少尽量减少该该操作。操作。对对上述程序上述程序进进行行优优化化利用利用利用利用breakbreak或或或或continuecontinue缩缩缩缩减需要被减需要被减需要被减需要被检查检查检查检查的除数范的除数范的除数范的除数范围围围围 , 还还还还是是是是2, n-1?2, n-1?脖报盯艘辑准侵脚湿肾悯
36、妇翔稍灾蒜顿决撅鳃巷藕橡帘岔湃尤堪咒黄凯儒第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202437思考思考思考思考 2 2: 求出所有的求出所有的求出所有的求出所有的100-200100-200之间之间之间之间的素数的素数的素数的素数双重循双重循环问题环问题。禄叠溉邦绵缔均涅继锚惫湘赋蛰诺禽割醒趟周香盏诲孝嘎橱裳顺们息旅缓第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/2024386.6 6.6 程序排错程序排错程序排错程序排错最优秀的程序员最优秀的程序员也很难保证其编写的程序能够在计算也很难保证其编写的程序能够在计算机上一次调试通过。机上一次调试通过。程序程序
37、出错并不可怕出错并不可怕,只要学会一定的程序测试和排错,只要学会一定的程序测试和排错技巧,出错就不再可怕;相反,我们还可以在错误中技巧,出错就不再可怕;相反,我们还可以在错误中学习并牢记宝贵的知识,并教导我们如何预防错误的学习并牢记宝贵的知识,并教导我们如何预防错误的再次发生。再次发生。掌握一些预防错误发生和减少错误的技术非常重要:掌握一些预防错误发生和减少错误的技术非常重要:好的算法设计好的算法设计好的算法设计好的算法设计、好的编程风格好的编程风格好的编程风格好的编程风格、限制全局数据结构的使用、限制全局数据结构的使用、限制全局数据结构的使用、限制全局数据结构的使用、边界条件测试等。边界条件
38、测试等。边界条件测试等。边界条件测试等。VC编译软件中有自动整理格式功能编译软件中有自动整理格式功能 只要选取需要的代码,按只要选取需要的代码,按ALT+F8就能自动就能自动整理成带缩进格式的整理成带缩进格式的c文件。文件。执囚掸宝瞩湘诡拾烦括旦铆角穗垮蕾悍诵痰瓢簇免馆翌囚蔽蹦捏趟佩糠史第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202439程序中常见的出错原因程序中常见的出错原因程序中常见的出错原因程序中常见的出错原因 1 11、编译错误;、编译错误; 编译过程中出现的错误,通常属于编译过程中出现的错误,通常属于编译过程中出现的错误,通常属于编译过程中出现的错误,通常属于语
39、法错误语法错误语法错误语法错误,即编写的语句不符合即编写的语句不符合即编写的语句不符合即编写的语句不符合C C语言的语法规则。语言的语法规则。语言的语法规则。语言的语法规则。Undefined symbol Undefined symbol XXXXXX XXX statement missing;XXX statement missing;Expression syntax errorExpression syntax errorRedeclaration of XXXRedeclaration of XXXToo few parameter in call;Too few paramete
40、r in call;贸漫弹曼雀衷顷逾篷秆索捧挽细署向展弗扼耸力异利基起芬悲胖勺豪境奸第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202440程序有哪些错误?程序有哪些错误?程序有哪些错误?程序有哪些错误?#include #include main() int m, i, k; printf(Please enter a number:) scanf(%d, m); k = sqrt(m); for (i=2; j k) printf(Yes!n); else printf(No!n); printf(Program is over!n);陋壤岂泡惰耻茬描鸟祟矢殃梯控攘扯惟浇
41、晋俱荚净馋孽承研耐炊吼洒蛮表第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202441程序中常见的出错原因程序中常见的出错原因程序中常见的出错原因程序中常见的出错原因22运行错误;运行错误; 指程序在运行过程中发生的错误,往往由于指程序在运行过程中发生的错误,往往由于语义上的错误造成。语义上的错误造成。 虽然虽然语法上正确语法上正确,但要求计算机去做不该但要求计算机去做不该做或者做不到的事情做或者做不到的事情。 例如,用例如,用0作为除数,运行后将显示作为除数,运行后将显示”Divi ision by zero”sion by zero”错误提示信息。错误提示信息。错误提示信息
42、。错误提示信息。 还有,程序运行出现还有,程序运行出现还有,程序运行出现还有,程序运行出现“ “死循环死循环死循环死循环” ”。署狱啦勒谬莫釉添迪墨淖突知毕剿好脑鹊庇悯澈把郑藉奠消流华簇熬而袱第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202442程序中常见的出错原因程序中常见的出错原因程序中常见的出错原因程序中常见的出错原因33逻辑错误逻辑错误 程序能得到运行结果,但结果总是不正确。程序能得到运行结果,但结果总是不正确。 这种错误比较隐蔽,编译软件很难给出错误这种错误比较隐蔽,编译软件很难给出错误信息,需要编程人员仔细分析程序本身。信息,需要编程人员仔细分析程序本身。 童抢
43、障腺摆惫诺靳谓疽始肇貉呈暖童饼响痢陷北疹婴碰骇起柒臼羹橙苛豺第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202443常见的逻辑错误常见的逻辑错误常见的逻辑错误常见的逻辑错误变量忘了赋初值,将获得随机值。变量忘了赋初值,将获得随机值。运算符运算符=和和=使用不当。使用不当。用用=比较两个浮点数是否相等。比较两个浮点数是否相等。用多个关系运算符表达一个复杂的逻辑表达式,而自己对用多个关系运算符表达一个复杂的逻辑表达式,而自己对运算规则不清楚。运算规则不清楚。 S Scanf( )canf( )读取值时,没有按格式控制符的要求输入数据。读取值时,没有按格式控制符的要求输入数据。读取
44、值时,没有按格式控制符的要求输入数据。读取值时,没有按格式控制符的要求输入数据。 s scanf( )canf( )读取值时,变量名前忘了读取值时,变量名前忘了读取值时,变量名前忘了读取值时,变量名前忘了&符号。符号。符号。符号。 printf( )printf( )输出时,格式控制符与变量类型不符。输出时,格式控制符与变量类型不符。输出时,格式控制符与变量类型不符。输出时,格式控制符与变量类型不符。 数值计算时,计算结果的值超出了变量的表示范围。数值计算时,计算结果的值超出了变量的表示范围。数值计算时,计算结果的值超出了变量的表示范围。数值计算时,计算结果的值超出了变量的表示范围。 S Sc
45、anf( )canf( )读取读取读取读取doubledouble数据时,没有使用数据时,没有使用数据时,没有使用数据时,没有使用“%lf”“%lf”格式控制符。格式控制符。格式控制符。格式控制符。 因刚烈蔫你南惊说植短若橇壤撬彰横揣郑旋骆齐津夫超或麓囤狐或摘芝询第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202444调试的基本方法调试的基本方法调试的基本方法调试的基本方法“粗分细找粗分细找”定位大致的范围:归纳、推理、二分、排除定位大致的范围:归纳、推理、二分、排除 缩减输入数据缩减输入数据缩减输入数据缩减输入数据设法找到能导致失败的最小输入设法找到能导致失败的最小输入设法
46、找到能导致失败的最小输入设法找到能导致失败的最小输入 采用注释的办法切掉一些代码(采用注释的办法切掉一些代码(采用注释的办法切掉一些代码(采用注释的办法切掉一些代码(P133, P133, P133, P133, 增量测试)增量测试)增量测试)增量测试)减少有关的代码区域,调试无误后再将它们打开注释,即采减少有关的代码区域,调试无误后再将它们打开注释,即采减少有关的代码区域,调试无误后再将它们打开注释,即采减少有关的代码区域,调试无误后再将它们打开注释,即采用分而治之的策略将问题局部化用分而治之的策略将问题局部化用分而治之的策略将问题局部化用分而治之的策略将问题局部化 利用调试工具;利用调试工具;利用调试工具;利用调试工具;逐条语句跟踪逐条语句跟踪逐条语句跟踪逐条语句跟踪 插入打印语句插入打印语句插入打印语句插入打印语句观看屏幕输出结果观看屏幕输出结果观看屏幕输出结果观看屏幕输出结果马炕多奎淌屿其剁固鼎豫南悬旺材涎直滥渺舟挛面烫雷滩蚁娱骨减帽帐岳第6章程序的控制结构2循环第6章程序的控制结构2循环7/25/202445课后作业课后作业课后作业课后作业P142习题习题:6.8, 6.14次烈叠跪抿剂贾孪盔敛缔扳帝凹竖度肋挫换哟创狸咐喻只扔摘凳面啃佐吩第6章程序的控制结构2循环第6章程序的控制结构2循环