《第6章程序的控制结构2循环.ppt》由会员分享,可在线阅读,更多相关《第6章程序的控制结构2循环.ppt(45页珍藏版)》请在三一文库上搜索。
1、第6章 程序的控制结构(2)循环,C程序设计语言,西南财经大学 王磊,6.1循环结构,当P为真,循环体,当P为真,循环体,当型循环两种形式,直到P为真,循环体,直到型循环两种形式,N,循环while语句,for语句,while(表达式) 循环语句; do 循环语句; while(表达式); for(表达式1; 表达式2; 表达式3) 循环语句; ,while语句,while (表达式) 循环语句; 只要表达式的值为非0(真),就重复执行while循环语句,直到表达式值为0(假)时止,do-while语句,do 循环语句; while (表达式); 首先执行语句,然后判断表达式的值。 如果表达式
2、为0,结束while循环语句。否则,再次执行循环语句。 语句会被至少执行一次,for语句,for (表达式1; 表达式2; 表达式3) 循环语句; ,循环起始条件 (通常对循环变量赋初值),循环结束条件 (每次执行循环语句前需判断),循环增量 (循环语句执行完一次后计算表达式3的值),(1) 计算表达式1, 计算表达式2。若表达式2的值0(不满足结束条件), 则执行循环语句, 若表达式2的值=0,则结束循环; 执行循环语句; (3) 计算表达式3, 再次判断表达式2的值.依此重复下去,直到表达式2的值=0(假)。,注意 循环变量的使用,通过循环变量i 的值来控制循环次数。 For循环的循环总次
3、数是已知的。,for ( i=1; i=100; i+) sum+=i; ,for语句,for (表达式1; 表达式2; 表达式3) 循环语句; 相当于: 表达式1和表达式3可以没有或者是用逗号分隔的多个表达式的组合。但最好不要有太多的表达式组合,选择三种循环的一般原则,如果循环次数已知,用for 如果循环次数未知,用while 如果循环体至少要执行一次,用do-while 这只是“一般”原则,不是“原则”,注意,在for和while语句之后一般没有分号 有分号表示循环体就是分号之前的内容(空循环体) while (i 100); i+; for (i = 0; i 100; i+); pri
4、ntf(“%d“, i); for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量,例:计算 n!=12n,分别用如下语句编程 for while do-while,循环次数已知,首先考虑用for循环语句 #include main() int i, n; /* i是循环变量*/ long p=1; /* 存放阶乘的值 */ printf(“Please enter n:“); scanf(“%d“, ,例:计算 n!=12n,例:计算 n!=12n,While循环语句实现 int i=1; while (i=n) p=p*i; i+; do while循环语句实现 int i=1
5、; do p=p*i; i+; while (i=n);,例:循环控制语句猜数游戏,猜数游戏用到的库函数,怎样模拟计算机“想”一个数呢? 随机函数rand() 产生0,RAND_MAX 之间的随机数 magic = rand(); #include RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767 产生0,b-1 之间的随机数 magic = rand()%b; 产生a,a+b-1 之间的随机数 magic = rand()%b + a;,例,#include #include main() int magic; /*计算机“想“的数*/ int guess; /*
6、人猜的数*/ magic = rand()%100 + 1; /*“想”一个1,100之间的数magic*/ printf(“Please guess a magic number:“); scanf(“%d“, ,例,#include #include main() int magic; int guess; int counter; /*记录人猜次数的计数器变量*/ magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0, 统计猜测次数*/ do printf(“Please guess a magic number:“); sca
7、nf(“%d“, ,#include #include #include main() int magic; int guess; int counter; srand(time(NULL); magic = rand() % 100 + 1; counter = 0; do printf(“Please guess a magic number:“); scanf(“%d“, ,实验3,6.3 嵌套循环,While循环语句的嵌套; while ( ) while ( ) ,for ( ; ; ) while ( ) do while ( ); ,使用嵌套的循环体时,应注意以下问题,在嵌套的各
8、层循环体中,使用复合语句(即用一对大花括号将循环体语句括起来)保证逻辑上的正确性 内层和外层循环控制变量不应同名,以免造成混乱 嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性 代码风格问题 循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环,例:打印乘法九九表,例,#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;
9、 m10; m+) printf(“%4d“, n * m); printf(“n“); ,例:打印下三角乘法九九表,#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.5 流程的转移控制,break语句 continue语句 got
10、o语句,break和continue,break语句: 退出循环结构语句或者switch 如果是嵌套循环,则只退出break语句所在的循环。 continue: 中断本次循环体的执行过程,并进行循环的下一轮 break和continue少用为妙,break和continue,例:单步运行演示break语句和continue语句的用法区别,#include main() int i, n; for (i=1; i=5; i+) printf(“Please enter n:“); scanf(“%d“, ,Please enter n:10 n = 10 Please enter n: -10
11、Program is over!,例 :单步运行演示break语句和continue语句的用法区别,#include main() int i, n; for (i=1; i=5; i+) printf(“Please enter n:“); scanf(“%d“, ,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!,标号举例 error: printf(“Errors!, e
12、xit!n” ); Goto语句举例 goto error; 一般形式 语句标号: goto 语句标号;,goto与标号(label),是goto的过错?还是程序员的过错?,破坏了结构化设计风格 容易带来错误隐患 如非必需,尽量不用goto main() int sum; goto next; sum=0; /*被goto跳过*/ next: printf(“%d“, sum); ,其他流程转移控制,标准库函数exit() 作用是终止整个程序的执行,强制返回操作系统 调用该函数需要嵌入头文件 用法: exit(code); code参数设置(惯例): 0 表示程序正常退出; 非0 表示程序出现
13、某种错误退出。,例题分析:素数问题,给定一个正整数n=91,判断它是不是素数。 判断标准: 素数只能被自身和1整除。例如, 91%1=0, 91%91=0. 思路: 将2至n-1之间的所有整数,同n进行求余操作,判断余数是否为0, 如果发现任意一次为0,则n必然不是素数。 循环语句。,程序结构,int main( ) /定义变量、初始化 / 进行计算、处理 / 输出结果 ,int main( ) int n=91; int x; /循环变量 int count=0; /用于统计n被整除的次数 for(x=2; x0) printf(“n不是是素数“); else printf(“n是素数“);
14、 return 0; ,思考1:,目的: 假设判断是否能够整除(n%x= =0)的计算开销很大,程序应该尽量减少该操作。 对上述程序进行优化 利用break或continue 缩减需要被检查的除数范围 , 还是2, n-1?,思考 2: 求出所有的100-200之间的素数,双重循环问题。,6.6 程序排错,最优秀的程序员也很难保证其编写的程序能够在计算机上一次调试通过。 程序出错并不可怕,只要学会一定的程序测试和排错技巧,出错就不再可怕;相反,我们还可以在错误中学习并牢记宝贵的知识,并教导我们如何预防错误的再次发生。 掌握一些预防错误发生和减少错误的技术非常重要: 好的算法设计、好的编程风格、
15、限制全局数据结构的使用、边界条件测试等。,VC编译软件中有自动整理格式功能 只要选取需要的代码,按ALT+F8就能自动整理成带缩进格式的c文件。,程序中常见的出错原因 1,1、编译错误; 编译过程中出现的错误,通常属于语法错误,即编写的语句不符合C语言的语法规则。 Undefined symbol XXX XXX statement missing; Expression syntax error Redeclaration of XXX Too few parameter in call;,程序有哪些错误?,#include #include main() int m, i, k; prin
16、tf(“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“); ,程序中常见的出错原因2,运行错误; 指程序在运行过程中发生的错误,往往由于语义上的错误造成。 虽然语法上正确,但要求计算机去做不该做或者做不到的事情。 例如,用0作为除数,运行后将显示”Division by zero”错误提示信息。 还有,程序运行出现“死循环”。,程序中常见的出错原因3,逻辑错误 程序能得到运行结
17、果,但结果总是不正确。 这种错误比较隐蔽,编译软件很难给出错误信息,需要编程人员仔细分析程序本身。,常见的逻辑错误,变量忘了赋初值,将获得随机值。 运算符=和=使用不当。 用=比较两个浮点数是否相等。 用多个关系运算符表达一个复杂的逻辑表达式,而自己对运算规则不清楚。 Scanf( )读取值时,没有按格式控制符的要求输入数据。 scanf( )读取值时,变量名前忘了&符号。 printf( )输出时,格式控制符与变量类型不符。 数值计算时,计算结果的值超出了变量的表示范围。 Scanf( )读取double数据时,没有使用“%lf”格式控制符。 ,调试的基本方法,“粗分细找” 定位大致的范围:归纳、推理、二分、排除 缩减输入数据 设法找到能导致失败的最小输入 采用注释的办法切掉一些代码(P133, 增量测试) 减少有关的代码区域,调试无误后再将它们打开注释,即采用分而治之的策略将问题局部化 利用调试工具; 逐条语句跟踪 插入打印语句 观看屏幕输出结果,课后作业,P142 习题:6.8, 6.14,
链接地址:https://www.31doc.com/p-2578293.html