
c语言教程(课件)第3章.ppt
29页第三章 C程序的流程设计一、算法ØØ算法的性质与组成要素算法的性质与组成要素ØØ算法是进行操作的方法和步骤算法是进行操作的方法和步骤ØØ算法的性质:算法的性质:ØØ解题算法是一有穷动作序列解题算法是一有穷动作序列ØØ序列中只有一个初始动作序列中只有一个初始动作ØØ序列中每一个动作仅有一个后继动作序列中每一个动作仅有一个后继动作ØØ序列终止,表示问题得到解答,或问题没有解答序列终止,表示问题得到解答,或问题没有解答ØØ算法的要素:算法的要素:ØØ操作:各种运算、操作:各种运算、I/OI/O读写均称为操作计算机算法是由操作读写均称为操作计算机算法是由操作组成的ØØ控制结构:控制结构:ØØ顺序结构顺序结构ØØ选择结构选择结构ØØ循环结构循环结构ØØ算法的描述算法的描述ØØ自然语言自然语言ØØ流程图流程图ØØ伪代码伪代码ØØ计算机语言计算机语言以求两个数的最大数为例说明几种算法以求两个数的最大数为例说明几种算法ØØ自然语言:自然语言: s1: s1: 输入两个数输入两个数a,ba,bs2:s2:找出最大数赋给找出最大数赋给m m s3:s3:输出最大数输出最大数mmS2.1:如果a大于b,则将a赋给m,否则将b赋给m。
输入输入a,ba,by y a>b a>b n n输出输出a a输出输出b bØØN-SN-S流程图:流程图:ØØ伪代码:伪代码: input a ,binput a ,bif a>b then if a>b then m=a m=a else else m=b m=bend ifend if print m print m ØØC C代码:代码: main()main(){ { int int a,b,m;a,b,m; scanfscanf(“%d (“%d %d”,&a,&b);%d”,&a,&b); if (a>b) if (a>b) m=a; m=a; else else m=b; m=b; printfprintf(“a=%d”,a);(“a=%d”,a);} } 上机问题:逻辑运算的注意事项。
E2-15二、用C语句描述算法ØØ表达式语句表达式语句ØØC C语言是一种表达式语言,所有操作都通过表达式来实语言是一种表达式语言,所有操作都通过表达式来实现ØØ由表达式组成的语句叫表达式语句,它由表达式后加由表达式组成的语句叫表达式语句,它由表达式后加一分号组成一分号组成ØØ表达式语句的三种基本类型:表达式语句的三种基本类型:ØØ赋值语句:赋值语句:x=sin(y);x=sin(y);ØØ函数语句函数语句: :printfprintf(“a=%d b=%d”,a,b);(“a=%d b=%d”,a,b);ØØ空语句空语句: ;: ;ØØ复合表达式语句复合表达式语句( (逗号表达式逗号表达式) ):几个表达式语句用:几个表达式语句用“ “ ,,” ”分隔组合而成,如分隔组合而成,如i=1 , j=2; i=1 , j=2; 逗号表达式的值为最逗号表达式的值为最后一个表达式的值,如后一个表达式的值,如 a=(a=6,a*3,a+3) a=(a=6,a*3,a+3) 结果结果a=9a=9ØØ复合语句复合语句( (分程序分程序) )ØØC C语言允许将一组语句括在一对花括号内,称为复合语句。
如:语言允许将一组语句括在一对花括号内,称为复合语句如:{ {c=c=getchargetchar( );( ); putchar putchar(c);(c); } }ØØ在分程序中可定义变量,但只在分程序中有效,且上级分程序中的在分程序中可定义变量,但只在分程序中有效,且上级分程序中的变量对下级分程序有效,反之无效如:变量对下级分程序有效,反之无效如: main( )main( ){ { int int a=2; a=2; { {intint b=3; b=3; printf printf(“a=%d b=%d ”,a,b); /*(“a=%d b=%d ”,a,b); /*正确,可使用上级分程序中定义的变量正确,可使用上级分程序中定义的变量a*/a*/ } } printf printf(“a=%d b=%d ”,a,b); /*(“a=%d b=%d ”,a,b); /*出错出错, ,下级分程序定义的变量对上级无效下级分程序定义的变量对上级无效*/ */} } 三、选择结构程序设计ØØif … else if … else 结构结构例例L3-3L3-3求一个数的绝对值。
求一个数的绝对值main()main(){ { int int x,y;x,y; scanfscanf(“%d”,&x);(“%d”,&x); if (x>=0) y=x; if (x>=0) y=x; else y=-x; else y=-x; printfprintf(“|%d|=%d”,x,y);(“|%d|=%d”,x,y);} }例例L3-4 L3-4 求三个数中的最大值求三个数中的最大值main()main(){ { int int a=12,b=2,c=24,max; a=12,b=2,c=24,max; clrscr clrscr();(); max=a; max=a; if(b>max)max=b; if(b>max)max=b; if(c>max)max=c; if(c>max)max=c; printf printf("max=%d",max);("max=%d",max); getch getch();();} }if …else if …else 的嵌套的嵌套 符号函数符号函数sign (sign (例例L3-4-2)L3-4-2)int int sign(float x)sign(float x){ {intint f; f; if (x>0) if (x>0) f =1; f =1; else else { if (x==0) f =0; { if (x==0) f =0; else f =-1; else f =-1; } } return( f ); return( f );} }ØØelse ifelse if结构结构: :是是if… elseif… else嵌套的一种变形。
嵌套的一种变形 ( (例例L3-4-L3-4-3)3)int int sign(float x)sign(float x){ {intint f ; f ; if (x>0) f =1 ; if (x>0) f =1 ; else if (x= =0) f =0 ; else if (x= =0) f =0 ; else f = -1; else f = -1; return( f ) ; return( f ) ;} }ØØswitchswitch结构结构switch( switch( 表达式表达式) ){ { case case 常量表达式常量表达式1 1:语句:语句1 1;;[ [break ;]break ;] case case 常量表达式常量表达式2 2:语句:语句2 2;;[ [break ;]break ;] …… …… case case 常量表达式常量表达式n n::语句语句n n;; [break ;] [break ;] default default::语句语句n+1;n+1;} }例例L3-6 L3-6 求分数的等级求分数的等级switch(switch(cjcj/10)/10) {case 0: {case 0: case 1: case 1: case 2: case 2: case 3: case 3: case 4: case 4: case 5: case 5: dj dj='c';break;='c';break; case 6: case 6: case 7: case 7: dj dj='b';break;='b';break; default: default:djdj='a';='a'; } }例例L3-7 L3-7 测试输入的是数字、空白还是其它字符。
测试输入的是数字、空白还是其它字符test_char(test_char(intint c) c){ { switch(c) switch(c) {case '0': case '1': case '2': case '3': {case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '4': case '5': case '6': case '7': case '8': case '9': case '8': case '9':printfprintf("It is a digit.\n");break;("It is a digit.\n");break; case ' ': case '\n': case ' ': case '\n': case '\t': case '\t':printfprintf("It is a white.\n");break;("It is a white.\n");break; default: default:printfprintf("It is a char.\n");("It is a char.\n"); } }例例L3-8 L3-8 联想猜词游戏。
联想猜词游戏 #include
或将所有可能状态都测试一遍ØØ计数器法计数器法ØØ标志法标志法ØØ迭代:是一个不断用新值取代变量的旧值,或由迭代:是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程旧值递推出变量的新值的过程穷举法实例ØØ求求所有水仙花数的问题所有水仙花数的问题ØØ水仙花数是指:一个三位数,其各位数字立方和等于水仙花数是指:一个三位数,其各位数字立方和等于该数本身该数本身 例如例如 153=1 153=13 3+3+33 3+5+53 3,故,故153153是水仙花数是水仙花数ØØ用穷举法解此题的思路:用穷举法解此题的思路:ØØ从最小的三位数开始,到最大的三位为止,一个个拿出来进从最小的三位数开始,到最大的三位为止,一个个拿出来进行判断,看是否是水仙花数行判断,看是否是水仙花数ØØ如何判断一个数如何判断一个数i i是否是水仙花数的关键:如何将一个三位数是否是水仙花数的关键:如何将一个三位数的各位取出的各位取出ØØ方法一、用数学方法计算出各位的值:方法一、用数学方法计算出各位的值:ØØ个位个位a a::a=i %10a=i %10ØØ百位百位c c::c=i /10c=i /10ØØ十位十位b b::b=(i/10)%10b=(i/10)%10ØØ方法二、各位依次从最小值到最大值一个个试:方法二、各位依次从最小值到最大值一个个试:ØØ个位个位a a::1 1 到到9 9ØØ百位百位c c::0 0到到9 9ØØ十位十位b b::0 0到到9 9迭代法实例ØØ求一元高次方程的近似解问题。
求一元高次方程的近似解问题ØØ一元五次以上的方程找不到通用的根的解析表达式,只能一元五次以上的方程找不到通用的根的解析表达式,只能求近似解求近似解ØØ穷举法解此题的思路:先找一个粗略解,再通过一定的方穷举法解此题的思路:先找一个粗略解,再通过一定的方法由粗略解得到一个更精确的解,法由粗略解得到一个更精确的解,…………直到找到的解的精直到找到的解的精度达到要求为止度达到要求为止ØØ方法一、二分迭代法:方法一、二分迭代法:ØØ先取两个粗略解先取两个粗略解x1,x2x1,x2,,如果如果f(x1),f(x2)f(x1),f(x2)符号相反,则方程在符号相反,则方程在( (x1,x2)x1,x2)中至少有一个根如果在该区间是单调函数,则有一个中至少有一个根如果在该区间是单调函数,则有一个实根ØØ进行二分:取进行二分:取x3=(x1+x2)/2x3=(x1+x2)/2作为一个新的粗略解,则它至少比作为一个新的粗略解,则它至少比x1,x2x1,x2中的一个更接近真实的解中的一个更接近真实的解ØØ将将x3x3和与和与x3x3反号的反号的x1x1或或x2x2作为新的一对粗略解,继续二分,直到作为新的一对粗略解,继续二分,直到这一对粗略解的差小于给定的误差为止。
这一对粗略解的差小于给定的误差为止x1x*x2f(x1)f(x3)f(x2)f(x4)x4x3迭代法实例ØØ求一元高次方程的近似解问题求一元高次方程的近似解问题ØØ方法二、牛顿迭代法(切线法):方法二、牛顿迭代法(切线法):ØØ设设x xk k是是方程方程f(x)=0f(x)=0的一个近似解,过的一个近似解,过P Pk k作作f(x)f(x)的切线的切线, ,有:有: f f ’ ’ (x)=f( (x)=f(x xk k)/()/(x xk k- -x xk k+1+1) ) 解得:解得:x xk k+1+1= =x xk k-f(-f(x xk k)/f )/f ‘ ‘ ( (x xk k) ) 该解比该解比x xk k更接近于实际解更接近于实际解ØØ再过再过x xk k+1+1作作f(x)f(x)的切线的切线, ,重复一述过程重复一述过程x*xkf(x)pkxk+1xk+21、While 循环结构ØØWhile While 循环控制结构循环控制结构while (while (条件表达式条件表达式) ) { { 循环体循环体 } }注意:如果循环体只有一个语句,则可不要花括号。
注意:如果循环体只有一个语句,则可不要花括号While While 循环的执行过程:循环的执行过程:1. 1.计算条件表达式的结果计算条件表达式的结果2. 2.结果为非结果为非0 0则执行循环体,再返回到则执行循环体,再返回到1 13. 3.结果为结果为0 0则不执行循环体,执行则不执行循环体,执行whilewhile循环后面的语句循环后面的语句ØØWhile While 循环举例循环举例例例L3-14 L3-14 简单的打印数据程序简单的打印数据程序1 1例例L3-15 L3-15 简单的打印数据程序简单的打印数据程序2 2例例L3-16 L3-16 输入字符原样输出输入字符原样输出1 1例例L3-16-2 L3-16-2 输入字符原样输出输入字符原样输出2 2例例L3-17 L3-17 等待用户输入指定字符等待用户输入指定字符例例L3-add L3-add 累加(累加(1+2+3+……1+2+3+……、、1+3+5+…… 1+3+5+…… 、、2+4+6+……2+4+6+……、、 3+6+9+…… 3+6+9+……))例例L3-L3-mul mul 累乘(累乘(n!n!)) 例例L3-flow L3-flow 求水仙花数求水仙花数例例L3-18 L3-18 搬砖问题搬砖问题 例例L3-19 L3-19 爱因斯坦阶梯问题爱因斯坦阶梯问题例例L3-minL3-min((2 2)) 求最小公倍(穷举法、求最小公倍(穷举法、加倍法加倍法))例例L3-20 L3-20 求最大公约数(欧几里德法)求最大公约数(欧几里德法)例例L3-21 L3-21 求平方根(牛顿迭代法)求平方根(牛顿迭代法)例例max_min max_min 求若干个数的最大、最小值。
求若干个数的最大、最小值do … while结构ØØ格式:格式:DoDo { { 循环体循环体 } } while(while(条件条件) );;注意:分号不能丢!for 结构ØØ格式:格式:for ( for ( 初始化表达式;条件表达式;修正表达式初始化表达式;条件表达式;修正表达式) ) { { 循环体循环体 } }1234三种循环举例例例1 1、求水仙花数、求水仙花数ØØL3-flowL3-flow::whilewhileØØL3-flow2: do … whileL3-flow2: do … whileØØL3-flow3: forL3-flow3: for例例2 2、求、求1+2+3+…+1+2+3+…+n nØØL3-sum: whileL3-sum: whileØØL3-sum2: do … whileL3-sum2: do … whileØØL3-sum3: forL3-sum3: forContinue 与break在循环中的应用ØØcontinue :continue :直接返回到循环的开始。
直接返回到循环的开始ØØbreak : break : 中止循环中止循环ØØ例例: :求求[1,1000][1,1000]能被能被7 7整除的数之和整除的数之和, ,当和大于当和大于10001000时就中止时就中止ØØL3-divL3-divgoto循环ØØ格式:格式:label:label:循环体循环体gotogoto label; label;例:求例:求1+2+3+……+1001+2+3+……+100 L3-L3-gotogoto L3-goto2L3-goto2注:一般情况下尽量不用注:一般情况下尽量不用gotogoto循环循环————导致程序结导致程序结构的破坏构的破坏综合举例ØØ例例1 1:打印九九表:打印九九表 L3-22L3-22 行列积式行列积式 L3-22-2L3-22-2 直角表达式直角表达式ØØ例例2 2:验证素数:验证素数 L3-23L3-23ØØ例例3 3:打印出:打印出900-1000900-1000间的所有素数间的所有素数 L3-23-2L3-23-2ØØ例例4 4:打印:打印FibonacciFibonacci数列的前数列的前n n项项 1 1 2 3 5 8 13 …… 1 1 2 3 5 8 13 …… (从第三项起,每个数为前两数之(从第三项起,每个数为前两数之和。
和 L3-24L3-24习题ØØE3-2E3-2ØØE3-4E3-4ØØE3-5 E3-5 牛的繁殖问题牛的繁殖问题年 1代 2代 3代 4代 总数1 1 1 2 1 13 1 14 2 25 3 3 6 4 47 5 1 68 6 2 1 99 7 3 2 1 13ØØE3-6E3-6。
