Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,第,6,章 程序的控制结构,(2),循环,C程序设计语言,西南财经大学,王磊,1,第6章 程序的控制结构(2)循环C程序设计语言西南财经大,6.1,循环结构,P,循环体,Y,N,当,P,为真,循环体,P,循环体,Y,N,当,P,为真,循环体,当型循环,两种形式,P,循环体,N,Y,直到,P,为真,循环体,P,循环体,Y,直到,P,为真,循环体,直到型循环,两种形式,N,6.1循环结构P循环体YN当P为真循环体P循环体YN当P为真,循环,while,语句,,for,语句,while,(,表达式,),循环语句,;,do,循环语句,;,while,(,表达式,);,for,(,表达式,1;,表达式,2;,表达式,3),循环语句,;,循环while语句,for语句while(表达式),while,语句,while,(,表达式,),循环语句,;,只要,表达式,的值为,非,0(,真,),,就重复执行,while,循环,语句,,直到,表达式,值为,0(,假,),时止,P,循环体,Y,N,while语句while(表达式)P循环体YN,do,-,while,语句,do,循环语句,;,while,(,表达式,);,首先执行,语句,,然后判断,表达式,的值。,如果表达式为,0,,结束,while,循环语句。否则,再次执行,循环,语句。,语句,会被至少执行一次,P,循环体,Y,N,do-while语句doP循环体YN,for,语句,for,(,表达式,1;,表达式,2;,表达式,3),循环语句,;,循环起始条件,(通常对循环变量赋初值),循环结束条件,(,每次执行循环语句前需判断,),循环增量,(循环语句执行完一次后计算表达式,3,的值),(1),计算,表达式,1,计算,表达式,2,。若,表达式,2,的值,0,(不满足结束条件),则执行循环语句,若,表达式,2,的值,=0,,则结束循环;,执行,循环语句,;,(3),计算,表达式,3,再次判断表达式,2,的值,.,依此重复下去,直到表达式,2,的值,=0(,假,),。,for语句for(表达式1;表达式2;表达式3)循,注意,循环变量,的使用,通过,循环变量,i,的值,来控制循环次数。,For,循环的,循环总次数,是,已知的,。,for(,i=1;i=100;i+,),sum+=i;,注意 循环变量的使用通过循环变量i 的值来控制循环次数,for,语句,for,(,表达式,1;,表达式,2;,表达式,3),循环语句,;,相当于:,表达式,1,和,表达式,3,可以没有或者是用逗号分隔的多个表达式的组合,。但最好不要有太多的表达式组合,表达式,1;,while,(,表达式,2),循环语句,;,表达式,3;,for语句for(表达式1;表达式2;表达式3),选择三种循环的一般原则,如果循环次数已知,用,for,如果循环次数未知,用,while,如果循环体至少要执行一次,用,do-while,这只是“一般”原则,不是“原则”,选择三种循环的一般原则如果循环次数已知,用for,注意,在,for,和,while,语句之后一般没有分号,有分号表示循环体就是分号之前的内容(空循环体),while,(i 100),;,i+;,for,(i=0;i 100;i+),;,printf(%d,i);,for,通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量,注意在for和while语句之后一般没有分号,例:计算 n!=12n,分别用如下语句编程,for,while,do-while,例:计算 n!=12n分别用如下语句编程,循环次数已知,首先考虑用,for,循环语句,#include ,main(),int i,n;,/*i,是循环变量*,/,long p=1;,/*,存放阶乘的值*,/,printf(Please enter n:);,scanf(%d,for(i=1;i=n;i+),p=p*i;,printf(%d!=%ldn,n,p);,例:计算 n!=12n,循环次数已知,首先考虑用for循环语句例:计算 n!=12,例:计算 n!=12n,While,循环语句实现,int i=1;,while(i=n),p=p*i;,i+;,do while,循环语句实现,int i=1;,do,p=p*i;,i+;,while(i magic),printf(Wrong!Too high!n);,else if,(guess magic),printf(Wrong!Too high!n);,else if,(guess magic),printf(Wrong!Too high!n);,else if,(guess magic),printf(Wrong!Too low!n);,else,printf(Right!n);,while,(guess!=magic),&(counter 10),);,printf(counter=%d n,counter);,实验3,最多猜,10,次,#include 实验3最多猜10次,6.3 嵌套循环,While,循环语句的嵌套;,while(),while(),for(;),while(),do,while();,6.3 嵌套循环While循环语句的嵌套;for(;,使用嵌套的循环体时,应注意以下问题,在嵌套的各层循环体中,,使用复合语句,(即用一对大花括号将循环体语句括起来),保证逻辑上的正确性,内层和外层循环控制变量不应同名,,以免造成混乱,嵌套的循环最好采用,右缩进格式书写,,以保证层次的清晰性,代码风格问题,循环嵌套不能交叉,,即在一个循环体内必须完整的包含着另一个循环,使用嵌套的循环体时,应注意以下问题 在嵌套的各层循环体中,使,例:打印乘法九九表,例:打印乘法九九表,例,#,include,main,(),int,m,n;,for,(m=1;m10;m+),printf(%4d,m);/*,打印表头*,/,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);,例#include ,例:打印下三角乘法九九表,例:打印下三角乘法九九表,#,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);,例,#include 例,6.5 流程的转移控制,break,语句,continue,语句,goto,语句,6.5 流程的转移控制 break语句,break,和,continue,break,语句,:,退出循环结构语句,或者,switch,如果是嵌套循环,则只退出,break,语句所在的循环。,continue,:,中断本次循环体的执行过程,并进行循环的下一轮,break,和,continue,少用为妙,break和continuebreak语句:,break,和,continue,假,假,真,真,break,表达式,1,表达式,2,循环语句后,的下一条语句,循环语句后,的下一条语句,假,假,真,真,表达式,1,表达式,2,continue,break和continue假假真真break表达式1表达式,例:单步运行演示,break,语句和,continue,语句的用法区别,#,include,main,(),int,i,n;,for,(i=1;i=5;i+),printf(Please enter n:);,scanf(%d,if,(n 0),break,;,printf(n=%dn,n);,printf(Program is over!n);,Please enter n:10,n=10,Please enter n:-10,Program is over!,例:单步运行演示break语句和continue语句的用法区,例,:单步运行演示,break,语句和,continue,语句的用法区别,#,include,main,(),int,i,n;,for,(i=1;i=5;i+),printf(Please enter n:);,scanf(%d,if,(n 0),continue,;,printf(n=%dn,n);,printf(Program is over!n);,Please enter n:10,n=10,Please enter n:-10,Please enter n:20,n=20,Please enter n:-20,Please enter n:30,n=30,Program is over!,例:单步运行演示break语句和continue语句的用法,标号举例,error:,printf(“Errors!,exit!n”);,Goto,语句,举例,goto,error;,一般形式,语句标号:,goto,语句标号,;,goto,与标号(,label,),标号举例goto与标号(label),是,goto,的过错?还是程序员的过错?,破坏了结构化设计风格,容易带来错误隐患,如非必需,尽量不用,goto,main(),int sum;,goto,next,;,sum=0;,/*被goto跳过*/,next:,printf(%d,sum);,是goto的过错?还是程序员的过错?破坏了结构化设计风格,其他流程转移控制,标准库函数,exit(),作用是,终止整个程序的执行,,强制返回操作系统,调用该函数需要嵌入头文件,用法:,exit(code);,code,参数设置(惯例):,0,表示程序正常退出;,非,0,表示程序出现某种错误退出。,其他流程转移控制,例题分析:素数问题,给定一个正整数,n=91,判断它是不是素数。,判断标准:素数只能被自身和,1,整除。例如,,91%1=0,91%91=0.,思路:,将,2,至,n-1,之间的所有整数,同,n,进行求余操作,判断余数是否为,0,,如果发现任意一次为,0,,则,n,必然不是素数。,循环语句。,例题分析:素数问题给定一个正整数n=91,判断它是不是素数,程序结构,int main(),/,定义变量、初始化,/,进行计算、处理,/,输出结果,程序结构int main(),int main(),int n=91;,int x;,/,循环变量,int count=0;,/,用于统计,n,被整除的次数,for(x=2;x0),printf(“n,不是是素数,);,else,printf(n,是素数,);,return 0;,int main(),思考1:,目的:假设判断是否能够整除(,n%x=0,)的计算开销很大,程序应该尽量减少该操作。,对上述程序进行优化,利用,break,或,continue,缩减需要被检查的除数范围,还是,2,n-1?,思考1:目的:假设判断是否能够整除(n%x=0)的计算,思考,2,:求出所有的,100-200,之间的素数,双重循环问题。,思考 2:求出所有的100-200之间的素数双重循环问题。,6.6 程序排错,最优秀的程序员,也很难保证其编写的程序能够在计算机上一次调试通过。,程序,出错并不可怕,,只要学会一定的程序测试和排错技巧,出错就不再可怕;相反,我们还可以在错误中学习并牢记宝贵的知识,并教导我们如何预防错误的再次发生。,掌握一些预防错误发生和减少错误的技术非常重要:,好