资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,*,While,、,do-while,、,for,语句,循环嵌套,Break,、,continue,、,goto,语句,exit(),函数,循环结构类型的选择及转换,循环结构程序设计举例,本章小结,学习目标,理解循环结构的含义;,掌握,C,语言三种循环结构的特点;,掌握,while,、,do-while,、,for,、,goto,、,break,、,continue,语句的使用方法;,掌握不同循环结构的选择及其转换方法;,掌握混合控制结构程序设计的方法。,学习内容,5.1,循环结构的程序设计,1.while,语句,一般形式:,while(,表达式,),循环体语句;,执行流程:,F,T,expr,循环体,while,其中:,while,后面的括号()不能省。,while,后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。,表达式的值是是循环的控制条件。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句,。,特点:先判断表达式,再执行循环体,说明:,循环体有可能一次也不执行,循环体如包括有一个以上的语句,则必须用,括起来,组成复合语句。,下列情况,退出,while,循环,条件表达式不成立(为零),循环体内遇,break,return,goto,无限循环,:while(1),循环体,;,【,例,5-1】,用,while,语句求,1,100,的累计和。,#include,void main(),int,i=1,sum=0;,while(i=100),sum+=i;,i+;,printf,(sum=%,dn,sum);,循环初值,循环终值,循环条件,循环体,循环变量增值,运行结果:,sum=5050,注意:,循环要赋初值,初值要放在循环体外。,【,例,6-1p】,显示,1,10,的平方,#include,void main(),int,i=1;,while(i 0),/a 0,为假,,b+,不可能执行,b+;,(4),在执行,while,语句之前,循环控制变量必须初始化,否则执行的结果将是不可预知的。,(5),要在,while,语句的某处(表达式或循环体内)改变循环控制变量,否则极易构成死循环。,(6),允许,while,语句的循环体又是,while,语句,从而形成双重循环。,while,语句注意事项:,例:计算,10!,#include,void main(),int,i;,/i,应赋初始值,10,long s=1;,while(i=1),s*=i-;,printf,(10!=%ldn,s);,i=1;,while(i 100),/,死循环,因为,i,的值没变化,永远小于,100,sum+=i;,printf,(sum=%,dn,sum);,i=1;,while(i=9),j=1;,while(j=9),printf,(%d*%d=%,dn,i,j,i*j);,j+;,i+;,while(1),循环体,;,【,例,6-2】,求两个正整数的最大公因子。,我们采用,Euclid,(欧几里德)算法来求最大公因子,其算法是:,(1),输入两个正整数,m,和,n,。,(2),用,m,除以,n,,余数为,r,,如果,r,等于,0,,则,n,是最大公因子,算法结束,否则,(3),。,(3),把,n,赋给,m,,把,r,赋给,n,,转,(2),。,#include,void main(),int,m,n,r;,printf,(Please input two positive integer:);,scanf,(%,d%d,while,(n!=0),r=m%n;,/,求余数,m=n;,n=r;,printf,(Their greatest common divisor is%,dn,m);,运行结果:,Please input two positive integer:24 56,Their greatest common divisor is 8,main(),int a=1,n;,printf(n input n:);,scanf(%d,while(n-),printf(%d ,a+*2);,输入:,n=2,n-=2,a+a=1a+*2,输出:,2n=1 a=2,n=1 a=2a+a=2a+*2,输出:,4n-=0 a=3,2.,do_while,语句,一般形式:,do,循环体语句;,while(,表达式,);,执行流程:,其中:,while,后面的括号()不能省。,while,最后面的分号,;,不能省。,while,后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。,表达式的值是是循环的控制条件。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句,。,F,T,expr,循环体,do,while,特点:先执行循环体,再判断表达式,【,例,5.2】,用,do_while,语句求,1,100,的累计和。,#include,void main(),int,i=1,sum=0;,do,sum+=i;,i+;,while(i 0);,(1),如果,do-while,后的表达式的值一开始就为假,循环体还是要执行一次。,(2),在,if,语句、,while,语句中,表达式后面都不能加分号,而在,do-while,语句的表达式后面则必须加分号,否则将产生语法错误。,(3),循环体中的语句可为任意类型的,C,语句。,(4),和,while,语句一样,在使用,do-while,语句时,不要忘记初始化循环控制变量,否则执行的结果将是不可预知的。,(5),要在,do-while,语句的某处(表达式或循环体内)改变循环控制变量的值,否则极易构成死循环。,(6)do-while,语句也可以组成多重循环,而且也可以和,while,语句相互嵌套。,例,5.3 while,和,dowhile,比较,#include,main(),int,i,sum=0;,scanf(%d,&i,);,do,sum+=i;,i+;,while(i=10);,printf(%d,sum,);,main(),int,i,sum=0;,scanf(%d,&i,);,while(i=10),sum+=i;,i+;,printf(%d,sum,);,输入:,1,输出:,55,输出:,55,输入:,11,输出:,11,输出:,0,Do while,语句先执行循环体,i+,,,sum=0+11.,再判断表达式,i=10,,不满足,退出。,While,语句先判断表达式,i=10,,不满足,退出,不执行循环体,当,while,后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则不相同,3.for,语句,一般形式:,for(,表达式,1,;表达式,2,;表达式,3),循环体语句;,执行流程:,其中:,for,后面的括号()不能省。,表达式,1,:,一般为赋值表达式,给控制变量赋初值。,表达式,2,:,关系表达式或逻辑表达式,循环控制条件。,表达式,3,:,一般为赋值表达式,给控制变量增量或减量。,表达式之间用分号分隔。,语句部分称为循环体,当需要执行多条语句时,应使用复合语句。,F,T,expr2,循环体,for,expr1,expr3,for,语句很好地体现了正确表达循环结构应注意的三个问题:,控制变量的初始化。,循环的条件。,循环控制变量的更新。,【,例,5-4】,用,for,语句求,1,100,的累计和。,#include,void main(),int,i,sum=0;,for(i=1;i=100;i+),sum+=i;,printf,(sum=%,dn,sum);,运行结果:,sum=5050,for,语句注意事项:,例:计算,1*2+3*4+5*6+99*100,。,int,i,j;,long sum=0;,for(i=1,j=2;i=99;i=i+2,j=j+2),sum+=i*j;,printf,(sum=%ldn,sum);,(1),表达式,1,、表达式,2,、和表达式,3,可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。,逗号表达式,逗号表达式,#include,void main(),int,i,sum=0;,i=1;,for(;i=100;i+),sum+=i;,printf(sum,=%,dn,sum);,#include,void main(),int,i,sum=0;,i=1;,for(;i=100;),sum+=i+;,printf(sum,=%,dn,sum);,for,语句注意事项:,省掉表达式,1,3,省掉表达式,1,(2),表达式,1,、表达式,2,、和表达式,3,都是任选项,可以省掉其中的一个、两个或全部,但其用于间隔的分号是一个也不能省的。,#include,void main(),int,i,sum=0;,i=1;,for(;),if(i 100)break;,sum+=i+;,printf(sum,=%,dn,sum);,省掉表达式,1,2,3,;,不能省,main(),int,i,j,k;,for(i,=0,j=10;i=j;i+,j-),k=i+j;,printf(%d+%d,=%dn,i,j,k);,表达式,1,和表达式,3,可以是逗号表达式,逗号表达式按从左到右原则,取最右边表达式的值,0+10=101+9=102+8=103+7=104+6=105+5=10,注意:,i=0,,,j=10,表达式值:,10,但,i=0 j=10,依然被赋值,for,语句注意事项:,for(a=1;a+),printf,(&,dn,a);,(3),表达式,2,如果为空则相当于表达式,2,的值是真,。,死循环!,(4),循环体中的语句可为任意类型的,C,语句。,(5)for,语句也可以组成多重循环,而且也可以和,while,语句和,do-while,语句相互嵌套。,(6),循环体可以是空语句。,例:计算用户输入的字符数(当输入是回车符时统计结束,),。,#include,void main(),int,n=0;,printf,(input a string:n);,for(;,getchar,()!=n;n+),;,printf,(%,d,n,);,表示循环体为空语句,并非表示,for,语句结束,(7),无限循环,:for(;),相当于:,while(1),语句,(8)for,语句可以转换成,while,结构,expr1;,while(expr2),循环体语句;,expr3;,例 用,for,循环求,#include,main(),int,i,sum=0;,for(,i=1,;,i=100,;,i+,),sum+=i;,printf(%d,sum,);,for(i,=1;i=100;i+),sum=,sum+i,;,等同于,i=1;,while(i=100),sum=sum+i;,i+;,例,1,:,(,用,for,循环实现,),计算,s=1+2+3+,+n (n,1),例,2,:说明以下循环语句的循环次数。,for(i=0;i=0;i-);,答:,(3)i=1;while(in)+i;,答:,(4)i=4;do i-;while(i0);,答:,(5)m=5;while(mj;i+,j-);,答:,n-1,次,n+1,次,n-1,次,1,次,0,次,0,次,for(k,=1;k=0);,答:,(2)s=0;for(i=0,j=100;i=j;i+,j-)s+=i+j;,printf(“%d”,s,);,答:,2,1,0,-1,5100,显然,,i+j,100,i,从,0,到,50,,共循环,51,次,例,3,:分析以下程序的输出结果,练习,例,1,:计算,s=1+2+3+,+n (n,1),#include“,stdio.h,”,main(),int,s,k,n;,printf(“Input,n=“);,scanf(“%d”,&n,);,s=0;k=1;,/*L1*/,while(k=n)s+=k;k+;,/*L2*/,printf(“s,=%dn”,s);,程序中,,/*L2*/,行可以简化为,while(k=n)s+=k+;,则可,省去复合词句。,练习,问题与思考:,/*L1*/,行,中,若令,k,的初值为,0,请填空,:,s=0;k=0;,while(,)s+=k+;,答:,(2),将,/*L2*/,行进行如下改动,请填空:,s=0;k=,;,while(,)k+;s+=k;,答:,s=0;k=1;,/*L1*/,while(k,=n)s+=k;k+;,/*L2*/,练习,应填入,k=n,或,kn+1,第一空应填入,0,或,-1,第二空应填入,kn,或,k=n-1,s=1+2+n,s=0+1+2+n,k=0 k+=1k=-1 k+=0,三种循环可互相嵌套,层数不限,外层循环可包含两个以上内循环,但不能相互交叉,嵌套循环的执行流程,(1)while(),while(),.,(2)do,do,while();,.,while();,(3)while(),do,while();,.,嵌套循环的跳转,禁止:,从外层跳入内层,跳入同层的另一循环,向上跳转,4.,循环嵌套,(4)for(;),do,while();,while(),.,外循环,内循环,内循环,例 循环嵌套,输出九九表,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,3,6,9,12,15,18,21,24,27,9,18,27,36,45,54,63,72,81,.,i,j,#include,main(),int,i,j;,for(i=1;i10;i+),printf(%4d,i);,printf(n-n,);,for(i=1;i10;i+),for(j=1;j10;j+),printf(j,=9)?%4dn:%4d,i*j);,1.i=1,j=1 i*j=1*1=1,2.i=1 j=2 i*j=1*2=2,3.i=1 j=9 i*j=9,换行,4.i=1,j=10,内循环结束,i=2,j=1,外循环赋初值,先做内循环,内循环结束,跳转到外循环,外循环改变初值,再做内循环。依次类推,直到外循环也不被满足,则跳出整个循环,i10,printf,假,(0),真,(,非,0),i=1,j+,j=1,j10,真,(,非,0),假,(0),i+,外循环,内循环,for(i,=1;i10;i+),for(j,=1;j10;j+),printf(j,=9)?%4dn:%4d,i*j);,1.i=1,j=1 i*j=1*1=1,2.i=1 j=2 i*j=1*2=2,3.i=1 j=9 i*j=9,换行,4.i=1,j=10,内循环结束,i=2,j=1,几种循环的比较,四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用,goto,型循环。,while,和,do-while,循环,循环体中应包括使循环趋于结束的语句。,for,语句功能最强。,用,while,和,do-while,循环时,循环变量初始化的操作应在,while,和,do-while,语句之前完成,而,for,语句可以在表达式,1,中实现循环变量的初始化。,5.,break,与,continue,语句,break,语句,功能:,在循环语句和,switch,语句中,终止并跳出循环体或开关体,说明:,(1)break,不能用于循环语句和,switch,语句之外的任何其它语句之中。,(2)break,只能,终止并跳出,最近一层,的结构,。,(3)break,语句对,if-else,的条件语句不起作用。,while(,表达式,1),if(,表达式,2),break;,语句,do,if(,表达式,2),break;,while(,表达式,1);,语句,for(;,表达式,1;),if(,表达式,2),break;,语句,5.7.1,用,break,语句提前终止循环,例,5.4,在全系,1000,学生中,征集慈善募捐,当总数达到,10,万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目。,5.7.1,用,break,语句提前终止循环,编程思路:,循环次数不确定,,但最多循环,1000,次,在循环体中累计捐款总数,用,if,语句检查是否达到,10,万元,如果达到就不再继续执行循环,终止累加,计算,人均捐款数,5.7.1,用,break,语句提前终止循环,编程思路:,变量,amount,,用来存放捐款数,变量,total,,用来存放累加后的总捐款数,变量,aver,,用来存放人均捐款数,定义符号常量,SUM,代表,100000,#include,#define SUM 100000,int,main(),float,amount,aver,total,;,int,i;,for(i=1,total=0;i=SUM),break,;,aver=total/i;,printf(“num,=%,dnaver,=%10.2fn“,i,aver,);,return 0;,指定符号常量,SUM,代表,100000,#include,#define SUM 100000,int,main(),float,amount,aver,total,;,int,i;,for(i=1,total=0;i=SUM),break,;,aver=total/i;,printf(“num,=%,dnaver,=%10.2fn“,i,aver,);,return 0;,应该执行,1000,次,#include,#define SUM 100000,int,main(),float,amount,aver,total,;,int,i;,for(i=1,total=0;i=SUM),break,;,aver=total/i;,printf(“num,=%,dnaver,=%10.2fn“,i,aver,);,return 0;,达到,10,万,,提前结束循环,#include,#define SUM 100000,int,main(),float,amount,aver,total,;,int,i;,for(i=1,total=0;i=SUM),break,;,aver=total/i;,printf(“num,=%,dnaver,=%10.2fn“,i,aver,);,return 0;,实际捐款人数,expr,break;,假,(0),真,(,非,0),while,do,break;,.,expr,假,(0),真,(,非,0),while,方法:,通过设置一标志变量,tag,,然后在每层循环后加上一条语句:,if(tag)break;,其值为,1,表示跳出循环体,为,0,则不跳出。,for(),while(),if()break;,while,循环后的第一条语句,int,tag=0;,for(),while(),if(),tag=1;,break;,if(tag)break;,for,循环后的第一条语句,多重循环中,,break,的使用,问:在嵌套循环的情况下,如何让,break,语句跳出最外层的的循环体?,continue,语句,功能:,结束本次循环,跳过,循环体中,尚未执行的语句,进行下一次是否执行循环体的判断。,说明:,(1),仅,用于循环语句中,。,(2),在嵌套循环的情况下,,continue,语句只对包含它的,最内层,的循环体语句起作用。,for(),while(),if(),continue;,while,循环后的第一条语句,break,和,continue,的区别,(,1,),break,能用于循环语句和,switch,语句中,,continue,只能用于循环语句中。,(2)continue,语句的作用是跳过循环本中剩余的语句而强行执行下一次循环,,break,结束整 个循环,不再判定循环条件是否满足。,(,3,)循环嵌套时,,break,和,continue,只影响包含它们的最内层循环,与外层循环无关。,N,表达式,1,Y,表达式,2,N,Y,N,表达式,1,Y,表达式,2,N,Y,break,语句,continue,语句,强行退出循环,只结束本次循环,5.7.2,用,continue,语句提前结束本次循环,例,5.5,要求输出,100,200,之间的不能被,3,整除的数。,编程思路:,对,100,到,200,之间的每一个整数进行检查,如果不能被,3,整除,输出,,否则,不输出,无论是否输出此数,都要接着检查下一个数,(,直到,200,为止,),。,N,n=100,n,200,Y,n,能被,3,整除,N,n=n+1,输出,n,Y,for(n,=100;n=200;n+),if(n%3=0),continue;,printf(%d,n);,例,5.6,输出以下,4*5,的矩阵。,1 2 3 4 5,2 4 6 8 10,3 6 9 12 15,4 8 12 16 20,解题思路:,可以用循环的嵌套来处理此问题,用外循环来输出一行数据,用内循环来输出一列数据,按,矩阵的格式,(,每行,5,个数据,),输出,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,累计输出数据的个数,控制,一行内,输出,5,个数据,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,双重循环,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,控制输出,4,行,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,控制每行中输出,5,个数据,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,i=1,时,j,由,1,变到,5,i*j,的值是,1,2,3,4,5,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,i=,2,时,j,也,由,1,变到,5,i*j,的值是,2,4,6,8,10,如何修改程序,不输出第一行的空行?,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,if(i=3,遇到第,3,行第,1,列,终止内循环,#include,int,main(),int,i,j,n,=0;,for(i=1;i=4;i+),for(j=1;j=5;j+,n+),if(n%5=0),printf,(“n”);,printf,(%,dt,i,*j);,printf(n,);,return 0;,if(i=3,原来第,3,行第,1,个数据,3,没有输出,5.8,循环程序举例,例,5.7,用,公式求,的近似值,直到发现某一项的绝对值小于,10,-6,为止,(,该项不累计加,),。,5.8,循环程序举例,解题思路:,求,近似,值的,方法,很多,本题是,一种,其他方法:,5.8,循环程序举例,每项的分子都是,1,后一项的分母是前一项的分母加,2,第,1,项的符号为正,从第,2,项起,每一项的符号与前一项的符号相反,5.8,循环程序举例,sign=1,pi=0,n=1,term=1,当,term 10,-6,pi=,pi+term,n=n+1,sing=-sign,term=sign/n,pi=,pi,*4,输出,pi,#include,#include,int,main(),int,sign=1;double pi=0,n=1,term=1;,while(fabs(term,)=1e-6),pi=,pi+term,;,n=n+2;,sign=-sign;,term=sign/n;,pi=,pi,*4;,printf(pi,=%10.8fn,pi);,return 0;,求绝对值的函数,只保证前,5,位小数是准确的,#include,#include,int,main(),int,sign=1;double pi=0,n=1,term=1;,while(fabs(term,)=1e-6),pi=,pi+term,;,n=n+2;,sign=-sign;,term=sign/n;,pi=,pi,*4;,printf(pi,=%10.8fn,pi);,return 0;,改为,1e-8,例,5.8,求费波那西,(Fibonacci),数列的前,40,个数。这个数列有如下特点:第,1,、,2,两个数为,1,、,1,。从第,3,个数开始,该数是其前面两个数之和。即,:,这是一个有趣的古典数学问题:,有一对兔子,从出生后第,3,个月起每个月都生一对兔子。,小兔子长到第,3,个月后每个月又生一对兔子。,假设所有兔子都不死,问每个月的兔子总数为多少?,第几个月,小兔子对数,中兔子对数,老兔子对数,兔子总数,1,1,0,0,1,2,0,1,0,1,3,1,0,1,2,4,1,1,1,3,5,2,1,2,5,6,3,2,3,8,7,5,3,5,13,输出,f1,f2,For i=1 to 38,f3=f1+f2,输出,f3,f1=f2,f2=f3,f1=1,f2=1,#include,int,main(),int,f1=1,f2=1,f3;,int,i;,printf(%12dn%12dn,f1,f2);,for(i,=1;i=38;i+),f3=f1+f2;,printf(%12dn,f3);,f1=f2;,f2=f3;,return 0;,代码可改进,#include,int,main(),int,f1=1,f2=1;,int,i;,for(i,=1;i=,20,;i+),printf(%12d%12d,f1,f2,);,if(i%2=0),printf(n,);,f1=f1+f2;,f2=f2+f1;,return 0;,例,5.9,输入一个大于,3,的整数,n,,判定它是否素数,(prime,,又称质数,),。,解题思路:,让,n,被,i,整,除,(i,的值从,2,变到,n-1),如果,n,能被,2,(n-1),之中任何一个整数整除,则表示,n,肯定不是素数,不必再继续被后面的整数除,因此,可以提前结束循环,注意:此时,i,的值必然小于,n,N,N,Y,n=i+1,输入,n,i=2,i n-1,Y,n,被,i,整除,i a,输出不是素数,Y,输出是素数,N,#include,int,main(),int,n,i,;,printf(“n,=?);,scanf(%d,&n,);,for(i=2;i=n-1;i+),if(n%i,=0)break;,if(i,n),printf(%d,is not,n,n,);,else,printf(%d,is,n,n,);,return 0;,#include,int,main(),int,n,i,;,printf(“n,=?);,scanf(%d,&n,);,for(i=2;i=n-1;i+),if(n%i,=0)break;,if(i,n),printf(%d,is not,n,n,);,else,printf(%d,is,n,n,);,return 0;,k=,sqrt(n,);,#include,int,main(),int,n,i,k,;,printf(“n,=?);,scanf(%d,&n,);,for(i=2;i=,k,;i+),if(n%i,=0)break;,if(i,n),printf(%d,is not,n,n,);,else,printf(%d,is,n,n,);,return 0;,k=,sqrt(n,);,#include,#include,int,main(),int,n,i,k,;,printf(“n,=?);,scanf(%d,&n,);,for(i=2;i=,k,;i+),if(n%i,=0)break;,if(i,=k,),printf(%d,is not,n,n,);,else,printf(%d,is,n,n,);,return 0;,k=,sqrt(n,);,#include,例,5.10,求,100,200,间的全部素数。,解题思路:,使用,例,5.9,的,算法,在,例,5.9,程序中,只要增加一个外循环,先后对,100,200,间的全部整数一一进行判定即可,for(n,=101;n=200;n=n+2),k=,sqrt(n,);,for(i=2;i=k+1),printf(%d,n);,m=m+1;,if(m%10=0),printf(“n,”);,只对奇数进行检查,控制每行输出,10,个数据,例,5.11,译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。,A B C D E F G W X Y Z,非字母字符保持原状不变,输入一行字符,要求输出其相应的密码,解题思路:问题的关键有两个:,(1),决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符,处理的方法是:输入一个字符给字符变量,c,,先判定它是否字母,(,包括大小写,),,若不是字母,不改变,c,的值;若是字母,则还要检查它是否,W,到,Z,的范围内,(,包括大小写字母,),。如不在此范围内,则使变量,c,的值改变为其后第,4,个字母。如果在,W,到,Z,的范围内,则应将它转换为,A,D(,或,a,d),之一的字母。,c=,getchar,();,解题思路:问题的关键有两个:,(1),决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符,处理的方法是:输入一个字符给字符变量,c,,先判定它是否字母,(,包括大小写,),,若不是字母,不改变,c,的值;若是字母,则还要检查它是否,W,到,Z,的范围内,(,包括大小写字母,),。如不在此范围内,则使变量,c,的值改变为其后第,4,个字母。如果在,W,到,Z,的范围内,则应将它转换为,A,D(,或,a,d),之一的字母。,if(c,=a&c=A&c=W&c=w&c=a&c=A&,c=W&c=w&,c=A&c=a&,c=Z&cz),c=c-26;,printf(%c,c,);,不能少,基本程序设计类型,一、统计(计数)问题,二、数列求和(求积):累加累乘递推法,三、字符图形,四、搜索(穷举)求解,五、数论有关问题,六、查找排序求最大值(最小值)数组,七、字符串处理,八、链表,九、文件处理,一、统计与计数问题,方法:计数变量,c,的初值为,0,每输入一个数据,,进行必要判断后,若输入的数据满足统,计条件,则计数变量,c,自加,1,,这样当对,所有输入进行判断后,计数变量,c,的值就,是统计的结果,例,2,:输入一行字符,统计其中的英文字母个数。,提示:即输入到字符,n,时停止输入,#include“,stdio.h,”,main(),char,ch,;,int,n=0;,printf(“Input,a string:n”);,while(1),ch,=,getchar();if(ch,=n)break;,if(ch,=,a&ch,=,A&ch,=Z),n+;,printf(“Number,of letters is%d.n”,n);,二、数列求和求积:累加累乘递推法,1.,基本累加累乘问题,累加求和与求均值,(1),(2),(3),累加法:,求和变量初值一般为,0,,每循环一次,求和变量自加一个数据,这样循环结束后,求和变量的值即为这些数据的和。,累,乘法,:累乘变量初值一般为,1,,每循环一次,累乘变量自乘一个数据,这样当循环结束的时候,累乘变量的值即为这些数据连乘的积。,例,1.,输入,n,个,100,分制成绩(用整型),计算并,输出平均成绩,要求输出精确到两位小数。,#include “,stdio.h,”,#define n 10,main(),double,av,=0;,int,score,i;,printf(“Input,%d,int,numbers:”,n);,for(i=1;i5,开始,2,i,t*,i,t,i+1,i,结束,N,Y,#include,#include,main(),int,s;,float,n,t,pi,;,t=1;pi=0;n=1.0;s=1;,while(fabs(t,)=1e-6),pi=,pi+t,;,n=n+2;,s=-s;,t=,s/n,;,pi=,pi,*4;,printf(pi,=%10.6fn,pi);,t=1,pi=0,n=1.0,s=1,当,|t|,1e-6,pi=pi+t,n=n+2,s=-s,t=s/n,pi=pi*4,输出,pi,分子:,1,,,-1,,,1,,,-1,分母:,1,,,3,,,5,,,7,,,.,累加和,分母,分子,每一项,2.,数列计算,求和求积,例 求,Fibonacci,数列:1,1,2,3,5,8,的前40个数,f1=1,f2=1,for i=1 to 20,输出,f1,f2,f1=f1+f2,f2=f2+f1,1,5,34,233,1597,10946,75025,514229,3524578,24157817,1,8,55,377,2584,17711,121393,832040,5702887,39088169,2,13,89,610,4181,28657,196418,1346269,9227465,63245986,3,21,144,987,6765,46368,317811,2178309,14930352,102334155,6.9,程序举例,#include,main(),long,int,f1,f2;,int,j;,f1=1;f2=1;,for(j,=1;j=20;j+),printf(%12ld%12ld ,f1,f2);,if(i%2=0),printf(n,);,f1=f1+f2;,f2=f2+f1;,j=1 f1=1,f2=1 f,1(,f3,)=f1+f2=1+1=2 f2(,f4,)=f2+f1(,f3,)=1+2=3,2.j=2 f 1(,f3,)=,=2 f2(,f4,)=3 f,1(,f5,)=f1+f2=f3+f4=2+3=5 f,2(,f6,)=f2+f1=3+5=8,6.9,程序举例,j=1,计算出,f3,f4j=2,计算出,f5,f6j=20
展开阅读全文