循环结构程序设计(一)
内 容
说明
本讲内容
重点
难点
引入
举例
1.循环结构的概念
2.While语句的一般形式、流程图、执行过程
3.Do--while 语句的一般形式、流程图、执行过程
4.for语句的一般格式、流程图、执行过程
5.三种循环的比较
1.While 语句的执行过程及while语句的应用
2.Do--while语句的执行过程及while语句的应用
3.for语句的的执行过程及应用
1.while语句的应用
2.Do--while语句应用
3.for语句的执行过程及应用
在许多问题中需要用到循环控制,例如,要输入全校学生成绩,求若干个数之和。迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。
一、循环结构的概念利用计算机重复处理某些实际问题就构成了循环结构。在循环结构中将某些语句重复执行,这些语句称为循环体;每重复一次都要判断是继续重复还是停止重复,这个判断所依据的条件称为循环条件;循环体与循环条件一起构成了循环结构。
例1:求1+2+3+……+9+10的和要完成上面的累加求和运算,设sum为累加和变量,i为循环控制变量,用于控制循环次数,也就是循环继续的条件,并且i由1变到10,实现上述算法的N-S图如下。
要用C语言实现上述算法,就要学习实现循环的语句。
举例
二、While语句
⑴【一般格式】
while(表达式)
{ 循环体语句
}
while 语句是一种先判断后执行的循环语句。
【注意】
①,表达式” 表达式可以是任何合法的C语言表达式。一般为关系表达式或逻辑表达式。
② 循环体可以是单个语句,也可是多个语句;如果是多个语句必须使用大括号“{ }”将多个语句括起来构成一个复合语句。
⑵【流程图及N-S图】
⑶【执行过程】
先计算表达式的值并判断,若表达式的值为真(非零),则执行循环体的语句;若表达式的值为假(零)时,结束循环。
⑷【应用】
利用while语句“求1+2+3+……+9+10的和”参考程序如下:
main()
{int sum,i;
sum=0;i=0;
while (i<=10)
{ sum+=i;
i++; }
printf(“sum=%d\n”,sum);
}
将实际问题如何写成关系表达式及逻辑表达式
分析程序的循环情况
程序写入TC环境中运行,观察运行结果
例2:利用while语句计算n!(即:1x2x3x……xn)
参考程序如下:
main( )
{ int i=1,n,s=1;
scanf(“%d”,&n);
while(i<=n)
{ s=s*i;
i++; }
printf("s=%d\n",s); }
三、do—while语句
⑴ 【一般格式】
do
{
循环体语句
} while(表达式);
do - while 语句是一种先执行后判断的循环语句。
⑵ 【流程图及N-S图】
⑶【执行过程】
先执行循环体语句,再计算表达式的值,若表达式的值为真(非零),再执行循环体的语句;当表达式的值为假(零)时,结束循环。
⑷【应用】
分析循环中语句的写法
举例
例3:用do—while语句编程实现 求1+2+3+……+9+10的和。
参考程序如下:
main( )
{ int i,sum=0;
i=1;
do
{ sum=sum+i;
i++; } while(i<=10);
printf("sum=%d\n",sum); }
例4:用do—while语句编程计算n!(即:1x2x3x……xn)
模仿例3同学们自己写出相应的程序。
四、while与do-while语句的区别
⑴ while语句是先判断,后执行的循环语句;而do-while语句是先执行,后判断循环语句。
⑵ 当第一次进行判断表达式的值时,表达式的值为假时,while语句不执行循环体语句,而转去执行循环结构的下一语句;而do-while语句先执行一次循环体语句,而后转去执行循环结构的下一语句。
⑶ 不论是while还是do-while语句构成的循环,在循环体中都应有修改循环控制变量值的语句,否则程序会进行无限循环状态。
1.while与do-while语句的格式。
2.循环条件的设计。
3.注意循环结束时循环变量的值。
4.while与do-while语句的比较
注意循环条件的位置
程序写入TC环境中运行,观察运行结果
五、for语句
⑴【一般格式】
for(表达式1;表达式2;表达式3)
循环体语句;
【注意】
循环体语句可以是单个语句,也可是复合语句或空语句。三个表达式之间用分号分隔。
⑵【流程图及N-S图】
一般:
表达式1:为循环变量赋初值。
表达式2:控制循环条件。
表达式3:控制循环变量的变化。
实例
⑶【执行过程】
先计算表达式1的值;再计算表达式2的值,若为真,则执行循环体,最后计算表达式3的值;再次计算表达式2的值,若为真,再执行循环体,再计算表达式3的值;直到某次表达式2的值为假循环结束,执行循环语句的后续语句。
⑷【应用】
利用for语句“求1+2+3+……+9+10的和”
参考程序如下:
main( )
{ int i;
for (sum=0,i=1;i<=10;i++)
{ sum=sum+i; }
printf("sum=%d\n",sum); }
⑸ for循环语句的特殊格式以【for (i=1;i<=10;i++) 】 语句为例
① 省略表达式1,语句格式为:
【for(;表达式2;表达式3)】→
② 省略表达式2,语句格式为
【for(表达式1;;表达式3)】→
③ 省略表达式3,语句格式为:
【for(表达式1;表达式2;)】→
④ 省略表达式1及3,语句格式为
for(;表达式2;) →
⑤ 省略三个表达式,语句格式为:
for(;;) →
六、三种循环语句的比较
⑴ while语句和for语句是属于先测试终止条件的循环语句,故循环体有可能一次也不执行。
⑵ do—while语句是后测试终止条件的循环语句,循环体至少执行一次。
⑶ for语句与while语句本质上相近,很容易互换。所有循环语句都是在终止条件为真时才能执行循环体。
⑷ 如果循环次数可以在进入循环语句之前确定,使用for语句较好;在循环次数难以确定时使用while和do—while语句较好。
分析循环过程
循环结束时变量i的值
举例说明
七、例题
【例1】 从键盘上输入10个数,求出其中的最大值与最小值。
参考程序如下
main( )
{ int i,x,max,min ;
scanf(“%d”,&x);
max=x; min=x;
for ( i=2; i<=10; i++)
{ scanf(“%d”,&x);
if ( x>max) max=x ;
else if( x<min) min=x;
}
printf(“max=%d min=%d\n”,max,min); }
【例2】 输出100到200之间可以被7整除的数。
main()
{ int k;
for(k=100;i<=200;i++)
{ if(k%7= =0)
printf("%d ",k);
}
}
【例3】用π/4≈1-1/ 3+1/5-1/7+1/9… 求π近似的值。直到最后一项的绝对值小于10-6为止。
#include <math.h>
main()
{
int s; /* s是放符号的变量 */
float n,t,sum,pi; /* n是第n项的分母,t是第n项的值,sum
t=1; sum=0 ; n=1 ; s=1;
while(fabs(t)>=.000001)
{ sum=sum+t; n=n+2; s= -s; t=s/n; }
pi=sum*4;
printf("pi=%f\n",pi);
}
【例4】计算用户输入的所有正整数的和,用户输入 0 时结束。
#include <stdio.h>
main()
{
long data,sum = 0;
do
{
printf(“Please input,data=”);
scanf("%ld",&data);
if( data < 0 ) continue;
sum = sum + data;
} while( data != 0 );
printf(“sum=%ld”,sum);}
【例5】从键盘输入一串小写字母,转换成大写字母输出。
作法1用for循环
#include<stdio.h>
main()
{ char c;
for(;(c=getchar())!=‘\n’;)
{ c=c-32;
printf(“%c”,c);
}
}
作法2 用while循环
#include<stdio.h>
main()
{ char c;
while((c=getchar())!=‘\n’)
{c=c-32;
printf(“%c”,c);
}}
【例6】求两个整数的最大公约数。
main( )
{int m,n;
int r; /*余数*/
printf(″请输入两个整数m,n,″);
scanf(″%d,%d″,&m,&n);
r=m%n;
while (r!=0)
{m=n;
n=r,
r=m%n; }
printf(″最大公约数=%d″,n); }
【例7】译密码。密码规律为∶每个字母用其后第四个字母代替,26个字母循环排列。
#include <stdio.h>
main()
{
char c,c1;
while((c=getchar())!='\n')
{
if((c>='a'&&c<='v') || (c>='A'&& c<='V'))c=c+4;
else if ((c>='w'&&c<='z') || (c>='W'&&c<='Z')) c=c-22;
printf("%c",c);
}
}
对程序进行详细分析
在TC环境中运行该程序
是累加器 */
循环结构程序设计(二)
内 容
说明
本讲内容
重点
难点
举例
实例
1.Break语句及应用
2.Continue语句及应用
3.Break语句与Continue语句区别
4.循环嵌套的概念及应用
分析面积大于100时循环执行了几次
解释结束本次循环的概念
Break、Continue语句及循环嵌套的应用
循环嵌套的应用
一、Break语句
【一般格式】
break;
【功能】使程序的执行从包含它的最内层循环或switch语句中跳出。
【注意】
break只能用于switch语句或循环语句中。在循环结构中通常用if语句与之配合使用。
Break语句只能从最内层循环跳到外层循环中。
【应用】
例 【计算半径r=1到r=10的圆面积,直到面积大于100为止】。
main()
{ int r;
float area;
for (r=1;r<=10;r++)
{ area=3.14*r*r;
if(area>=100) break;
printf("r=%d area=%f\n",r,area); }
}
二、continue语句
【一般格式】 continue;
【功能】 结束本次循环,继续下一次循环。
【注意】
continue语句只用于循环结构中,通常与if语句配合使用。
【应用】
例 输出100到200之间不能被7整除的数。
main()
{ int n;
for(n=100;n<=200;n++)
{ if(n%7= =0) continue;
printf("%d\t",n); }
}
三、break语句与continue语句区别
continue是结束本次循环,进行下一次循环,而不是结束整个循环过程。对单层循环,break语句是结束整个循环,转到循环体外;对于多层循环,则是结束最内层循环。
例 将上例中的continue;换成break;执行程序,观察输出结果。
四、循环嵌套的概念及应用
当一个循环结构中包含另一个循环结构时,称为循环的嵌套或多重循环。在循环嵌套中。
【应用】
例 编程输出乘法“九九表”。
main ( )
{ int m,n,k;
for (m=1 ;m<=9;m++)
{ for(n=1;n<=m;n++)
printf("%d*%d=%d ",n,m,n*m);
printf("\n");
}
}
五、综合例题例1 分析下列程序,写出输出结果。
main()
{ int a,b=1;
for(a=1;a<=200;a++)
{ if(b>=20) break;
if(b%3= =1)
{ b+=3;
continue; }
b-=5;
printf(“%d”,b); }
}
例 2计算1!+2!+3!+…+100!。
main( )
{ int i,j
double t;
double s;
s=0;
for(i=1; i<=100,i++) /*求和*/
{t=1;
for(j=1; j<=i; j++) /*求每个i数阶乘*/
t*=j;
s+=t;
}
printf(″1!+2!+3!+…+100!=%f″,s);
}
在TC环境中运行程序
注意:
break;与continue;的作用
分析内层循环与外层循环的关系
注意内层循环的条件j<=i
而不是j<=100
循环结构程序设计(三)
内容
说明
本讲内容
c程序中的穷举法和递推算法
重点
穷举法和递推算法
难点
穷举法和递推算法的实际应用
一、穷举法:
概念:把所有可能的方案都一一测试,找出其中符合条件的方案。
例:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如153就是一水仙花数。
153=13+53+33
【分析】
把100到999之间的所有的数都一一测试,把符合每一位数字的立方和等于该数本身的数输出。
【程序】
作法1
#include<stdio.h>
main()
{ int s,m,i,r;
for(i=100;i<=999;i++)
{ m=i;
s=0;
while(m)
{ r=m%10;
s+=r*r*r;
m=m/10;
}
if(s==i) printf("\n%4d",i); }
}
这个程序用了双重循环,内层循环用于从一个数中截取每一位数字,再求每一个数的三位数字的立方和的操作。
作法2
#include<stdio.h>
main()
{ int i,a,b,c;
clrscr();
for(i=100;i<=999;i++)
{ a=i%10;
b=(i/10)%10;
c=i/100;
if(sa*a*a+b*b*b+c*c*c ==i) printf("\n%4d",i);
}
}
例 求出100~200以内的所有素数。
main()
{
int m,k,i,n=0;
for(m=101;m<=200;m=m+2)
{ k=sqrt(m);
for(i=2;i<=k ;i++)
if(m % i= =0) break;
if(i>=k+1)
{ printf(" %d",m); n=n+1;}
if( n%10= =0) printf("\n");
}
printf(“\n”); }
二、递推法:
概念:在前面一个或几个结果的基础上推出下一个结果的算法为递推算法。
例1:求fibonacci数列数列的前20项。第一项的第二都是1,从第三项开始往后每一项都是相邻的前两项之和,如:1,1,2,3,5,8,13……
【分析】递推基础是第一项和第二项,递推关系是后边一项是相邻的前两项之和。(如下图)
【程序】
#include<stdio.h>
main()
{ int i=3;
long int f1=1,f2=1,f3;
clrscr();
printf("%12ld%12ld",f1,f2);
for(;i<=20;i++)
{f3=f1+f2;
printf("%12ld",f3);
if(i%5==0) printf("\n");
f1=f2;
f2=f3;
}}
1 1 2 3 5……
f1 + f2 = f3
f1 + f2= f3
f1 + f2 = f3
……
三、思考与练习
1、输出1到1000之间所有的同构数,所谓同构数指一个数出现在它的平方数的右边,如5的平方是25,5出现在25的右边,25的平方是625,25出现有625的右边。
2、猴子吃桃问题。猴子第一天摘下若干个桃子,立即吃了一半,还不过瘾又多吃了一个,第二天将第一天剩下的桃子吃了一半又多吃了一个,以后每天以这个规律吃下去,到第十天再去吃时发现只剩下一个桃子,问猴子第一天摘了多少个桃子。
把i变量的值保存起来,因为每次循环结束m已为0
为什么s=0不放在for循环前面?
普遍用于从一个数中截取每一位数字的操作。
这种作法很简单,用%和/两个运算符。
采用变量重新赋值。
内 容
说明
本讲内容
重点
难点
引入
举例
1.循环结构的概念
2.While语句的一般形式、流程图、执行过程
3.Do--while 语句的一般形式、流程图、执行过程
4.for语句的一般格式、流程图、执行过程
5.三种循环的比较
1.While 语句的执行过程及while语句的应用
2.Do--while语句的执行过程及while语句的应用
3.for语句的的执行过程及应用
1.while语句的应用
2.Do--while语句应用
3.for语句的执行过程及应用
在许多问题中需要用到循环控制,例如,要输入全校学生成绩,求若干个数之和。迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。
一、循环结构的概念利用计算机重复处理某些实际问题就构成了循环结构。在循环结构中将某些语句重复执行,这些语句称为循环体;每重复一次都要判断是继续重复还是停止重复,这个判断所依据的条件称为循环条件;循环体与循环条件一起构成了循环结构。
例1:求1+2+3+……+9+10的和要完成上面的累加求和运算,设sum为累加和变量,i为循环控制变量,用于控制循环次数,也就是循环继续的条件,并且i由1变到10,实现上述算法的N-S图如下。
要用C语言实现上述算法,就要学习实现循环的语句。
举例
二、While语句
⑴【一般格式】
while(表达式)
{ 循环体语句
}
while 语句是一种先判断后执行的循环语句。
【注意】
①,表达式” 表达式可以是任何合法的C语言表达式。一般为关系表达式或逻辑表达式。
② 循环体可以是单个语句,也可是多个语句;如果是多个语句必须使用大括号“{ }”将多个语句括起来构成一个复合语句。
⑵【流程图及N-S图】
⑶【执行过程】
先计算表达式的值并判断,若表达式的值为真(非零),则执行循环体的语句;若表达式的值为假(零)时,结束循环。
⑷【应用】
利用while语句“求1+2+3+……+9+10的和”参考程序如下:
main()
{int sum,i;
sum=0;i=0;
while (i<=10)
{ sum+=i;
i++; }
printf(“sum=%d\n”,sum);
}
将实际问题如何写成关系表达式及逻辑表达式
分析程序的循环情况
程序写入TC环境中运行,观察运行结果
例2:利用while语句计算n!(即:1x2x3x……xn)
参考程序如下:
main( )
{ int i=1,n,s=1;
scanf(“%d”,&n);
while(i<=n)
{ s=s*i;
i++; }
printf("s=%d\n",s); }
三、do—while语句
⑴ 【一般格式】
do
{
循环体语句
} while(表达式);
do - while 语句是一种先执行后判断的循环语句。
⑵ 【流程图及N-S图】
⑶【执行过程】
先执行循环体语句,再计算表达式的值,若表达式的值为真(非零),再执行循环体的语句;当表达式的值为假(零)时,结束循环。
⑷【应用】
分析循环中语句的写法
举例
例3:用do—while语句编程实现 求1+2+3+……+9+10的和。
参考程序如下:
main( )
{ int i,sum=0;
i=1;
do
{ sum=sum+i;
i++; } while(i<=10);
printf("sum=%d\n",sum); }
例4:用do—while语句编程计算n!(即:1x2x3x……xn)
模仿例3同学们自己写出相应的程序。
四、while与do-while语句的区别
⑴ while语句是先判断,后执行的循环语句;而do-while语句是先执行,后判断循环语句。
⑵ 当第一次进行判断表达式的值时,表达式的值为假时,while语句不执行循环体语句,而转去执行循环结构的下一语句;而do-while语句先执行一次循环体语句,而后转去执行循环结构的下一语句。
⑶ 不论是while还是do-while语句构成的循环,在循环体中都应有修改循环控制变量值的语句,否则程序会进行无限循环状态。
1.while与do-while语句的格式。
2.循环条件的设计。
3.注意循环结束时循环变量的值。
4.while与do-while语句的比较
注意循环条件的位置
程序写入TC环境中运行,观察运行结果
五、for语句
⑴【一般格式】
for(表达式1;表达式2;表达式3)
循环体语句;
【注意】
循环体语句可以是单个语句,也可是复合语句或空语句。三个表达式之间用分号分隔。
⑵【流程图及N-S图】
一般:
表达式1:为循环变量赋初值。
表达式2:控制循环条件。
表达式3:控制循环变量的变化。
实例
⑶【执行过程】
先计算表达式1的值;再计算表达式2的值,若为真,则执行循环体,最后计算表达式3的值;再次计算表达式2的值,若为真,再执行循环体,再计算表达式3的值;直到某次表达式2的值为假循环结束,执行循环语句的后续语句。
⑷【应用】
利用for语句“求1+2+3+……+9+10的和”
参考程序如下:
main( )
{ int i;
for (sum=0,i=1;i<=10;i++)
{ sum=sum+i; }
printf("sum=%d\n",sum); }
⑸ for循环语句的特殊格式以【for (i=1;i<=10;i++) 】 语句为例
① 省略表达式1,语句格式为:
【for(;表达式2;表达式3)】→
② 省略表达式2,语句格式为
【for(表达式1;;表达式3)】→
③ 省略表达式3,语句格式为:
【for(表达式1;表达式2;)】→
④ 省略表达式1及3,语句格式为
for(;表达式2;) →
⑤ 省略三个表达式,语句格式为:
for(;;) →
六、三种循环语句的比较
⑴ while语句和for语句是属于先测试终止条件的循环语句,故循环体有可能一次也不执行。
⑵ do—while语句是后测试终止条件的循环语句,循环体至少执行一次。
⑶ for语句与while语句本质上相近,很容易互换。所有循环语句都是在终止条件为真时才能执行循环体。
⑷ 如果循环次数可以在进入循环语句之前确定,使用for语句较好;在循环次数难以确定时使用while和do—while语句较好。
分析循环过程
循环结束时变量i的值
举例说明
七、例题
【例1】 从键盘上输入10个数,求出其中的最大值与最小值。
参考程序如下
main( )
{ int i,x,max,min ;
scanf(“%d”,&x);
max=x; min=x;
for ( i=2; i<=10; i++)
{ scanf(“%d”,&x);
if ( x>max) max=x ;
else if( x<min) min=x;
}
printf(“max=%d min=%d\n”,max,min); }
【例2】 输出100到200之间可以被7整除的数。
main()
{ int k;
for(k=100;i<=200;i++)
{ if(k%7= =0)
printf("%d ",k);
}
}
【例3】用π/4≈1-1/ 3+1/5-1/7+1/9… 求π近似的值。直到最后一项的绝对值小于10-6为止。
#include <math.h>
main()
{
int s; /* s是放符号的变量 */
float n,t,sum,pi; /* n是第n项的分母,t是第n项的值,sum
t=1; sum=0 ; n=1 ; s=1;
while(fabs(t)>=.000001)
{ sum=sum+t; n=n+2; s= -s; t=s/n; }
pi=sum*4;
printf("pi=%f\n",pi);
}
【例4】计算用户输入的所有正整数的和,用户输入 0 时结束。
#include <stdio.h>
main()
{
long data,sum = 0;
do
{
printf(“Please input,data=”);
scanf("%ld",&data);
if( data < 0 ) continue;
sum = sum + data;
} while( data != 0 );
printf(“sum=%ld”,sum);}
【例5】从键盘输入一串小写字母,转换成大写字母输出。
作法1用for循环
#include<stdio.h>
main()
{ char c;
for(;(c=getchar())!=‘\n’;)
{ c=c-32;
printf(“%c”,c);
}
}
作法2 用while循环
#include<stdio.h>
main()
{ char c;
while((c=getchar())!=‘\n’)
{c=c-32;
printf(“%c”,c);
}}
【例6】求两个整数的最大公约数。
main( )
{int m,n;
int r; /*余数*/
printf(″请输入两个整数m,n,″);
scanf(″%d,%d″,&m,&n);
r=m%n;
while (r!=0)
{m=n;
n=r,
r=m%n; }
printf(″最大公约数=%d″,n); }
【例7】译密码。密码规律为∶每个字母用其后第四个字母代替,26个字母循环排列。
#include <stdio.h>
main()
{
char c,c1;
while((c=getchar())!='\n')
{
if((c>='a'&&c<='v') || (c>='A'&& c<='V'))c=c+4;
else if ((c>='w'&&c<='z') || (c>='W'&&c<='Z')) c=c-22;
printf("%c",c);
}
}
对程序进行详细分析
在TC环境中运行该程序
是累加器 */
循环结构程序设计(二)
内 容
说明
本讲内容
重点
难点
举例
实例
1.Break语句及应用
2.Continue语句及应用
3.Break语句与Continue语句区别
4.循环嵌套的概念及应用
分析面积大于100时循环执行了几次
解释结束本次循环的概念
Break、Continue语句及循环嵌套的应用
循环嵌套的应用
一、Break语句
【一般格式】
break;
【功能】使程序的执行从包含它的最内层循环或switch语句中跳出。
【注意】
break只能用于switch语句或循环语句中。在循环结构中通常用if语句与之配合使用。
Break语句只能从最内层循环跳到外层循环中。
【应用】
例 【计算半径r=1到r=10的圆面积,直到面积大于100为止】。
main()
{ int r;
float area;
for (r=1;r<=10;r++)
{ area=3.14*r*r;
if(area>=100) break;
printf("r=%d area=%f\n",r,area); }
}
二、continue语句
【一般格式】 continue;
【功能】 结束本次循环,继续下一次循环。
【注意】
continue语句只用于循环结构中,通常与if语句配合使用。
【应用】
例 输出100到200之间不能被7整除的数。
main()
{ int n;
for(n=100;n<=200;n++)
{ if(n%7= =0) continue;
printf("%d\t",n); }
}
三、break语句与continue语句区别
continue是结束本次循环,进行下一次循环,而不是结束整个循环过程。对单层循环,break语句是结束整个循环,转到循环体外;对于多层循环,则是结束最内层循环。
例 将上例中的continue;换成break;执行程序,观察输出结果。
四、循环嵌套的概念及应用
当一个循环结构中包含另一个循环结构时,称为循环的嵌套或多重循环。在循环嵌套中。
【应用】
例 编程输出乘法“九九表”。
main ( )
{ int m,n,k;
for (m=1 ;m<=9;m++)
{ for(n=1;n<=m;n++)
printf("%d*%d=%d ",n,m,n*m);
printf("\n");
}
}
五、综合例题例1 分析下列程序,写出输出结果。
main()
{ int a,b=1;
for(a=1;a<=200;a++)
{ if(b>=20) break;
if(b%3= =1)
{ b+=3;
continue; }
b-=5;
printf(“%d”,b); }
}
例 2计算1!+2!+3!+…+100!。
main( )
{ int i,j
double t;
double s;
s=0;
for(i=1; i<=100,i++) /*求和*/
{t=1;
for(j=1; j<=i; j++) /*求每个i数阶乘*/
t*=j;
s+=t;
}
printf(″1!+2!+3!+…+100!=%f″,s);
}
在TC环境中运行程序
注意:
break;与continue;的作用
分析内层循环与外层循环的关系
注意内层循环的条件j<=i
而不是j<=100
循环结构程序设计(三)
内容
说明
本讲内容
c程序中的穷举法和递推算法
重点
穷举法和递推算法
难点
穷举法和递推算法的实际应用
一、穷举法:
概念:把所有可能的方案都一一测试,找出其中符合条件的方案。
例:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如153就是一水仙花数。
153=13+53+33
【分析】
把100到999之间的所有的数都一一测试,把符合每一位数字的立方和等于该数本身的数输出。
【程序】
作法1
#include<stdio.h>
main()
{ int s,m,i,r;
for(i=100;i<=999;i++)
{ m=i;
s=0;
while(m)
{ r=m%10;
s+=r*r*r;
m=m/10;
}
if(s==i) printf("\n%4d",i); }
}
这个程序用了双重循环,内层循环用于从一个数中截取每一位数字,再求每一个数的三位数字的立方和的操作。
作法2
#include<stdio.h>
main()
{ int i,a,b,c;
clrscr();
for(i=100;i<=999;i++)
{ a=i%10;
b=(i/10)%10;
c=i/100;
if(sa*a*a+b*b*b+c*c*c ==i) printf("\n%4d",i);
}
}
例 求出100~200以内的所有素数。
main()
{
int m,k,i,n=0;
for(m=101;m<=200;m=m+2)
{ k=sqrt(m);
for(i=2;i<=k ;i++)
if(m % i= =0) break;
if(i>=k+1)
{ printf(" %d",m); n=n+1;}
if( n%10= =0) printf("\n");
}
printf(“\n”); }
二、递推法:
概念:在前面一个或几个结果的基础上推出下一个结果的算法为递推算法。
例1:求fibonacci数列数列的前20项。第一项的第二都是1,从第三项开始往后每一项都是相邻的前两项之和,如:1,1,2,3,5,8,13……
【分析】递推基础是第一项和第二项,递推关系是后边一项是相邻的前两项之和。(如下图)
【程序】
#include<stdio.h>
main()
{ int i=3;
long int f1=1,f2=1,f3;
clrscr();
printf("%12ld%12ld",f1,f2);
for(;i<=20;i++)
{f3=f1+f2;
printf("%12ld",f3);
if(i%5==0) printf("\n");
f1=f2;
f2=f3;
}}
1 1 2 3 5……
f1 + f2 = f3
f1 + f2= f3
f1 + f2 = f3
……
三、思考与练习
1、输出1到1000之间所有的同构数,所谓同构数指一个数出现在它的平方数的右边,如5的平方是25,5出现在25的右边,25的平方是625,25出现有625的右边。
2、猴子吃桃问题。猴子第一天摘下若干个桃子,立即吃了一半,还不过瘾又多吃了一个,第二天将第一天剩下的桃子吃了一半又多吃了一个,以后每天以这个规律吃下去,到第十天再去吃时发现只剩下一个桃子,问猴子第一天摘了多少个桃子。
把i变量的值保存起来,因为每次循环结束m已为0
为什么s=0不放在for循环前面?
普遍用于从一个数中截取每一位数字的操作。
这种作法很简单,用%和/两个运算符。
采用变量重新赋值。