《C语言程序设计(第3章).ppt》由会员分享,可在线阅读,更多相关《C语言程序设计(第3章).ppt(50页珍藏版)》请在三一办公上搜索。
1、C 语言程序设计,第三章 程序控制结构 集美大学计算机学院,2,本章主要内容,程序设计方法简述选择结构程序设计 if else 语句 switch语句循环结构程序设计 四种循环语句常用算法 枚举法(穷举法)归纳法(递推法),3,教学目的和要求掌握算法的基本概念与特征熟练掌握三种基本结构:顺序结构分支结构ifelse和Switch 语句循环结构:for、while、do-while掌握 break 与continue的不同作用掌握常用算法:枚举法和归纳法重点与难点C语言的四种循环语句break 与continue的基本作用常用算法思想,4,一、程序设计方法简述 1、计算机处理问题的过程,【例一】
2、让某学生解方程 ax2+bx+c=0 P72 例3.5求解过程:,分析问题 这是一个一元二次方程(代数问题,须中学代数知识)确定处理方案 用求根公式确定解题步骤 确定a、b、c的值 求出b2-4ac的值 如果 b2-4ac0(双实根)X1=X2=如果 b2-4ac=0(单实根)X1=X2=如果 b2-4ac0(双复根)X1=X2=根据上述步骤计算写出答案,整理、分析结果,5,一、程序设计方法简述3、程序测试,目的 发现程序中的错误(Bug)程序错误 语法错误(编译系统检查)逻辑错误(编程人员检查)方法与技术 测试是以程序通过了编译,没有语法和连接错误为前提。在此基础上运行一组数据,来检测程序的
3、逻辑错误。这一组测试数据应是以“任何程序都是有错误的”为前提精心设计出来的。它不仅应含有被测程序各种情况下的代表性输入数据,还应包括程序执行这些数据后预期的结果。其他 著名计算机软件科学家曾断言:“程序测试只能证明错误的存在,而不能证明错误的不存在”。可以证明,除了很小的程序外,无论使用任何方法,要想做到彻底的测试,即发现程序中的所有错误,是不现实的。常见所谓“版”商业软件,就是软件正式发行前的测试版本。,6,二、选择结构程序设计1、if语句,三种形式:if(表达式)语句;if(表达式)语句1;else 语句2;if(表达式1)语句1;else if(表达式2)语句2;else if(表达式n
4、)语句n;else 语句n+1;e1?e2:e3 是if else 语句在特定情况下的变体。,7,二、选择结构程序设计1、if语句 示例,【例一】以下程序的作用是什么?main()char c;printf(“Input:”);scanf(“%c”,/*将小写字母转换为大写字母*/,8,二、选择结构程序设计1、if语句 示例,【例二】以下程序的执行结果是什么?main()int x=2,y=-1,z=2;if(xy)if(y0)z=0;else z+=1;printf(“%dn”,z);,/*结果是2*/,哦,原来是因为else 总是与靠近它的if配套,常见错误:if(x0);if(x=2)i
5、f(10”);y=x-1;,9,二、选择结构程序设计2、switch语句,switch 语句的一般形式:switch(e)case c1:语句组1;case c2:语句组2;case cn:语句组n;default:语句组n+1;/*可缺省*/,/*e 表达式(整型、字符型或枚举型)*/,c1cn 常量(整数、字符、常量表达式如3+4,不含变量或函数),default 不是c1cn的情况(位置不一定在最后)。,10,二、选择结构程序设计2、switch语句 示例,main()char s;scanf(“%c”,输入“c”,求输出结果。,结果:6069 60 error,?!,11,二、选择结构
6、程序设计2、switch语句 示例,main()char s;scanf(“%c”,我的成绩应该是6069!,什么!“60”?“错误输入”?怎么会这样?!,不好意思,我属于C级!,运行结果:6069 60 错误输入,12,二、选择结构程序设计2、switch语句 示例,解决方法break语句:main()char s;scanf(“%c”,这才差不多!,break!,运行结果:6069,13,二、选择结构程序设计2、switch语句 示例,解决方法break语句:main()char s;scanf(“%c”,讨论switch(s)语句中的s实际上并非真正的条件选择,而只是一种跳转指示(与if
7、语句不同),表示下面应该跳转到什么位置继续执行。而各case实际上只是一个跳转处的标记。当程序跳转到某个case处时,并非只执行此case行的程序组,而是从此处开始一直向下执行各条语句,直到整个switch开关体结束(“”)。如果要使每个case处相当于一种if(s)else的效果,必须在其语句组最后加上break语句。,14,二、选择结构程序设计2、switch语句 示例,main()int x=1,y=0,a=0,b=0;switch(x)case 1:switch(y)case 0:a+;break;case 1:b+;break;case 2:a+;b+;break;case 3:a+
8、;b+;printf(“a=%d,b=%dn”,a,b);,说明1、每个case常量表达式的值必须互不相同,否则会出现互相矛盾的结果。2、允许多个case共用一个执行语句。,求程序运行结果。,结果:a=2,b=1。,如果x=2?,结果:a=1,b=1,如果x=3?,结果:a=1,b=1,15,三、循环结构程序设计,循环是在循环条件为真时计算机反复执行的一组指令(循环体)。循环控制通常有两种方式:计数控制事先能够准确知道循环次数时用之 用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。标记控制事先不知道准确的循环
9、次数时用之 由专门的标记变量控制循环是否继续进行。当标记变量的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。,16,三、循环结构程序设计,在C语言中可用以下语句构成循环:if goto while do while for 其中if goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。其他三种语句是C语言提供的循环结构专用语句。,17,三、循环结构程序设计,循环结构两大要素:循环条件 p 结束循环的条件表达式循环体 A 循环执行的语句或语句组设置循环条件要特别注意确
10、定:循环变量的初值循环变量的终值循环变量的变化规律,名词解释无限循环死循环,名词解释空循环,18,三、循环结构程序设计1、if goto语句循环结构,【例一】main()int n=0,sum=0;loop:sum+=n;+n;if(sum=10000)goto loop;printf(“n=%dn”,n);,【例二】main()int n=0,sum=0;loop:if(sum=10000)goto end;sum+=n;+n;goto loop;end:printf(“n=%dn”,n);,直到型,当 型,19,三、循环结构程序设计2、while语句循环结构,【例三】main()int n
11、=0,sum=0;while(sum=10000)sum+=n;+n;printf(“n=%dn”,n);,当 型,一般形式 while(条件表达式)循环体;用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内应有改变条件使循环结束的语句,否则可能陷入“死循环”。,20,三、循环结构程序设计3、dowhile语句循环结构,【例四】main()int n=0,sum=0;do sum+=n;+n;while(sum=10000)printf(“n=%dn”,n);,一般形式 do 循环语句(组)while(条件表达式);用于构成直到型循环:先执行
12、后判断/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。,直到型,直到sum超过10000为止,21,三、循环结构程序设计3、dowhile语句循环结构 示例【例五】从键盘输入一个整数12456,分析以下程序运行结果。,main()int num,c;printf(“请输入一个整数:“);scanf(“%d”,/*取得num的个位数*/,/*输出num的个位数*/,/*直到num/10为0*/,结果:65421将各位数字反序显示出来,22,三、循环结构程序设计4、for语句循环结构,一般形式 for(表达式1;条件
13、表达式;表达式3)循环语句(组);用于构成计数型当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。表达式1:整个循环中只执行1次,常用来对循环变量设置初值条件表达式(表达式2):其值为真(非0)时继续执行循环语句(组),否则结束循环表达式3:常用于循环变量值的更新(循环体的一部分每次循环语句组执行完后执行一次),【例六】求i=1+2+3+4+99+100(i=1100)main()int i,s=0;for(i=1;i=100;i+)s=s+i;printf(“Sum=%dn”,s);,23,三、循环结构程序设计5、其他循环控制结构,break 结束循环 在switch中退出s
14、witch结构;在循环中结束循环。continue 结束本次循环 循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto 跳转 跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转,反之不可!,main()int a,y;a=10,y=0;do a+=2;y+=a;if(y50)break;while(a=14);printf(a=%d,y=%dn,a,y);,结果:a=16,y=60,变量跟踪 a y 10 0 12 12 14+2 16+12=28 14+2 16+28=44 14+2 16+44=60,变量跟踪分析法,24,三、循环结构程序设计5、其他循环控制结构,
15、break 结束循环 在switch中退出switch结构;在循环中结束循环。continue 结束本次循环 循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto 跳转 跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转,反之不可!,求以下程序段执行后x和i的值。int i,x;for(i=1,x=1;i=10)break;if(x%2=1)x+=5;continue;x-=3;,结果:x的值为10,i的值为6,变量跟踪 i x 1 16 2 63 3 38 4 85 5 510 6,25,三、循环结构程序设计5、其他循环控制结构,break 结束循环 在switch
16、中退出switch结构;在循环中结束循环。continue 结束本次循环 循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto 跳转 跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转,反之不可!,main()int i=1;while(i=15)if(+i%3!=2)continue;else printf(%d,i);printf(n);,结果:2 5 8 11 14,变量跟踪 i+i%3 输出i 12 2 2 23 0 34 1 45 2 5 56 0,26,三、循环结构程序设计5、其他循环控制结构,break 结束循环 在switch中退出switch结构;在
17、循环中结束循环。continue 结束本次循环 循环“短路”(跳过循环体后面的语句,开始下一轮循环)。goto 跳转 跳到循环体外指定标号处。【注意】goto 语句只能从循环内向外跳转,反之不可!,main()int i,k=0;for(i=1;i+)k+;while(ki*i)k+;if(k%3=0)goto loop;loop:printf(%d,%d,i,k);,结果:2,3,27,四、常用算法,1、枚举法(穷举法)P79“笨人之法”:把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。【例一】百元买百鸡:(P62例:3.2)用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,
18、小鸡1元/3只。分析:这是个不定方程三元一次方程组问题(三个变量,两个方程)xyz=100 5x3yz/3=100 设公鸡为x只,母鸡为y只,小鸡为z只。,28,百元买百鸡问题分析,main()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100,结果:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84,【讨论 此为“最笨”之法要进行101101101=1030301次(100多百次)运算。,29,百元买百鸡问题分析,main()int x,
19、y,z;for(x=0;x=19;x+)for(y=0;y=33;y+)z=100-x-y;if(5*x+3*y+z/3.0=100)printf(“cocks=%d,hens=%d,chickens=%dn,x,y,z);,【讨论】令z=100-x-y 只进行101101=10201 次运算(前者的1%),取x=19,y=33 只进行2034=680 次运算(第1种运算的6.7%),30,【例二】雨水淋湿了算术书的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?(3)2=89,分析 设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中
20、A的取值范围为29,其余取值范围为09。条件表达式即为给定算式。,31,main()int A,B,C,D,E;for(A=2;A=9;A+)for(B=0;B=9;B+)for(C=0;C=9;C+)for(D=0;D=9;D+)for(E=0;E=9;E+)if(A*(B*10+3+C)*A*(B*10+3+C)=8009+D*100+E*10)printf(“%2d%2d%2d%2d%2dn”,A,B,C,D,E);,结果:3 2 8 6 4,【例二】雨水淋湿了算术书的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?(3)2=89,32,【例三
21、】求100200之间不能被3整除也不能被7整除的数。,分析:求某区间内符合某一要求的数,可用一个变量“穷举”。所以可用一个独立变量x,取值范围100200。,for(x=100;x=200;x+)if(x%3!=0,如果是求指定条件的奇数呢?,如果是求指定条件的偶数呢?,x=101;x=200;x=x+2,x=100;x=200;x=x+2,33,2、归纳法(递推法)P80“智人之法”:通过分析归纳,找出从变量旧值出发求新值的规律。,四、常用算法,【例一】编程求i=1+2+3+4+99+100(i=0100),分析 i=0 S0=0(初值)i=1 S1=0+1=S0+1 i=2 S2=1+2=
22、S1+2 i=3 S3=1+2+3=S2+3 i=4 S4=1+2+3+4=S3+4 i=n Sn=1+2+3+4+n=Sn-1+n,34,【例一】编程求i=1+2+3+4+n(n 100),程序:main()int i,n,s=0;printf(n=);scanf(%d,运行结果:n=100Sum=5050,如果是i=1+1/2+1/3+1/n 呢?,35,算法类型小结:累加型,【累加型】类型诸如+求其前n项之和的编程题。,累加型算法 若设i为循环变量,s为前n项累加之和,则程序的基本结构为:s=0;for(i=1;i=n;i+)s=s+;,36,【例二】编程求11/2+1/31/4+1/5
23、+1/991/100,分母为奇数时,相加分母为偶数时,相减,法1:从变化规律分析,程序:main()int i;float s=0;for(i=1;i=100;i+)if(i%2)s=s+1/i;else s=s-1/i;printf(Sum=%fn,s);,运行结果:Sum=1.000000,错在哪里?,37,【例二】编程求11/2+1/31/4+1/5+1/991/100,法2:这是个累加型算法的编程题,程序:#include main();int i;float s=0;for(i=1;i=100;i+)s=s+pow(-1,i+1)/i;printf(Sum=%fn,s);,程序:#i
24、nclude main()int i,k=1;float s=0;for(i=1;i=100;i+)s=s+k/i;k=-k;printf(Sum=%fn,s);,累加型算法程序基本结构为:s=0;for(i=1;i=n;i+)s=s+;,错在哪里?(如何检查程序错误?),运行结果:Sum=0.688172,运行结果:Sum=1.000000,38,【例三】编程求n!(n由键盘输入),分析 i=0 S0=1=S0(初值)i=1 S1=01=S01 i=2 S2=12=S12 i=3 S3=123=S23 i=4 S4=1234=S34 i=n Sn=1 234n=Sn-1n,39,【例三】编程
25、求n!(n由键盘输入),程序:main()int i,n,s=1;printf(n=);scanf(%d,运行结果:n=5Sum=120,运行结果:n=8Sum=-25216,Why?,40,算法类型小结:阶乘型,【阶乘型】类型诸如 求其前n项之积的编程题。,阶乘型算法 若设i为循环变量,s为前n项相乘之积,则程序的基本结构为:s=1;for(i=1;i=n;i+)s=s*;,41,【例四】编程求n!=1!+2!+3!+n!(n由键盘输入),外循环为累加型内循环为阶乘型,法1:从变化规律分析,程序:main()int i,j,n;float s,s1;printf(请输入n=);scanf(%
26、d,运行结果:n=5Sum=153,/*如果n值较大,可改为printf(“Sum=%en”,s);*/,42,【例四】编程求n!=1!+2!+3!+n!(n由键盘输入),在同一个循环中 先阶乘,后累加,法2:通过单循环实现,程序:main()int i,n;float s,s1;printf(请输入n=);scanf(%d,运行结果:n=5Sum=153,43,【例五】兔子繁殖问题(斐波那契数列问题)著名意大利数学家斐波那契(Fibonacci)1202年提出一个有趣的问题。某人想知道一年内一对兔子可以生几对兔子。他筑了一道围墙,把一对大兔关在其中。已知每对大兔每个月可以生一对小兔,而每对小
27、兔出生后第三个月即可成为“大兔”再生小兔。问一对小兔一年能繁殖几对小兔?,分析:表示大兔,表示小兔,由分析可以推出,每月新增兔子数Fn=1,1,2,3,5,8,13,21,34,(斐波那契数列)月份n 兔子数Fn 1 F1=1 2 F2=1 3 F3=2=F1+F2 4 F4=3=F2+F3 5 F5=5=F3+F4 n Fn=Fn-1+Fn-2,44,【例五】兔子繁殖问题(斐波那契数列问题),main()int f1=1,f2=1,f,i,s,n;clrscr();printf(请输入月数:);scanf(%d,对照:P80例3.12,45,【例六】编程显示以下图形(共N 行,N 由键盘输入
28、)。*,此类题目分析的要点是:通过分析,找出每行空格、*与行号i、列号j及总行数N的关系。其循环结构可用右图表示。,分析:(设N=5)第1行 4个空格=5-1 1个“*”=2*行号-1第2行 3个空格=5-2 3个“*”=2*行号-1第3行 2个空格=5-3 5个“*”=2*行号-1第4行 1个空格=5-4 7个“*”=2*行号-1第5行 0个空格=5-5 9个“*”=2*行号-1,由此归纳出:第i行的空格数N-i个;第i行的“*”数是2i-1个。,46,除了以上例题,要求根据教材掌握:,1、测试键盘输入的是数字、空白还是其它字符2、判断一个数是否素数问题3、打印九九表,47,判断一个数是否素
29、数问题,#include main()int m,k,i;clrscr();printf(x=);scanf(%d,把im-1改为isqrt(m-1)比较i的值,48,第三章 作业,一、编程题【要求】所有编程题须上机调试通过。源程序要求按缩进形式书写,代码端正整齐。1、编写一个程序,计算-32768+32767之间任意整数(由键盘输入)中各位奇数的平方和。2、编写一个程序,计算给定n时符合下式要求S的值。n由键盘输入(n为不大于10的整数)。S=(n(6(5+(4(3+(12)3、设有一四位数abcd=(ab+cd)2,编写一个程序,求a、b、c、d。(如2025,3025等)4、鸡兔问题:鸡兔共30只,脚共有90个。编写一个程序,求鸡、兔各多少只。,49,第三章 作业,一、编程题 5、编写一个程序,求S值(n由键盘输入):(程序检验参考:x=6.66,n=8时,s=40.955;x=6.66,n=15时,s=-1.511)6、编写一个程序,求前 n 项之和S值,其中 n1,x 0。(n由键盘输入):1 2x 3 5x 8 13x S=-+-+-+.2x 3 5x 8 13x 21(程序检验参考:x=6.66,n=8时,s=-16.492;x=6.66,n=15时,s=-28.469),50,第三章 作业,一、编程题7、编写一个程序,输出3100之间的全部素数,