1.有一只猴子吃一堆果子,已知每天吃昨天剩下的果子的一半再多一个,直到第10天才吃完。问原来这堆果子有多少个?
题目变换:关于小明分糖果题;关于楼层小球弹跳后求楼高题。
本题题目分析:第10天才吃完,那就是说第11天剩下0个。
设第10天没吃之前还有x个,依题意,可得:x-(1/2x+1)=0 ——>x=2
同样的道理,设第9天没吃之前还有x个,可得:x-(1/2x+1)=2 ——>x=(2+1)*2;
从这两个表达式可以看出,s(i)=2*(s(i+1)+1);这个表达式说明了前后两天果子数之间的关系。
程序:
#i nclude
main()
{
int i,s=0;
for(i=10;i>0;i--)
s=2*(s+1);
printf("s=%d\n",s);
getch(); } 程序说明:
for循环变量用于控制循环次数,可以换成for(i=1;i<=10;i++)
2.
国际象棋棋盘有64格,若在第1格放1粒谷;第2格放2粒谷;第3格放4粒谷;第4格放8粒谷……如此一直放到第64格。假设2000000粒谷有一顿重,问需要多少吨谷才够放?
第几格 1 2 3 4 …… 64
每格粒数 1 2 4 8 …… ?
总粒数 1 3 7 15 …… ?
规律:每一格粒数应为前一格粒数的2倍。n=n*2;
每一格总粒数应为前一格总粒数加上当前格的粒数。s=s+n;
再加上循环,用于控制循环的次数;
程序
#i nclude
main()
{
int i;
float n,s;
i=1;
n=1.0;
s=1.0;
for(i=2;i<=64;i++)
{n=n*2;s=s+n;}
printf("s=%f\n",s/2000000);
getch(); } 程序说明:
1) 本程序主要难点在于发现前后两格之间粒数的关系,在求得总粒数之前,必须先求出当前格的粒数。然后再进行累加。
2) 循环变量主要用于控制循环的次数。
3.
有一个数列,已知第一个数是0,第二个数是1。从第三个数开始每一个数是它前面两个数之和。求出这个数列的第3个至第24个数各是多少?
分析:
第几项 (1) (2) (3) (4) …… (24)
第
几
项
的
值 0 1 ? ? …… ?
a b c=a+b ? …… ?
a
新第一项 b
新第二项 c=a+b …… ?
…… ?
…… c=a+b
首先求第三个数,c=a+b=0+1=1; 求第四个数时,为了继续使用c=a+b;需要把第三项的值赋给b,第二项的值赋给a。如此循环,直至求出第24项。
程序:
main()
{
int a,b,c,i;
a=0;b=1;
for(i=3;i<=24;i++)
{
c=a+b;
printf(“m”,c);
a=b;
b=c;
}
} 程序解释:
1) 循环变量i的作用是用于计算循环的次数,本身与循环体无关,因此我们也可以写成:for(i=1;i<=22;i++)
2) 如果需要把第1,2个数也输出来,可以在for循环之前输入:printf(“0 1”);
3) 不能将最后两个赋值语句颠倒。
4. 求1+x/1!+x2/2!+x3/3!+……+xn/n!=?
分析:第0项是1,第一项是x/1,第二项是(x*x)/(1*2),第二项/第一项=x/2;
第二项是(x*x)/(1*2),第三项是(x*x*x)/(1*2*3),第三项/第二项=x/3;
…………
第n-1项是xn-1/(n-1)!,第n项是xn/n!,则第n项/第n-1项=x/n;
由此可以看出,我们为了求和,必须先求出第n项的值:
s(n)=s(n-1)*x/n;这个式子是我们解题的关键步骤。
程序
#i nclude
main()
{
int i,n,x;
float t,s;
printf("please input the result of n\n");
scanf("%d",&n);
printf("please input the result of x\n");
scanf("%d",&x);
t=1.0;s=1.0;
for(i=1;i<=n;i++)
{
t=t*x/i;
s=s+t;
}
printf("s=%f\n",s);
} 程序说明:
1) 在使用scanf函数前应用一条printf语句进行提示;
2) 解题的关键在于循环体的求出:
t=t*x/i; s=s+t;
5. 5.双重循环的使用(循环的嵌套使用)
双重循环的引入:
for(a=1;a<=3;a++)
{
for(b=1;b<=4;b++)
printf(“%d*%d=%d”,a,b,a*b);
printf(“\n”);
}
执行过程:
a 1 2 3
b 1 2 3 4 1 2 3 4 1 2 3 4
令a<=3为条件1,b<=4为条件2。
当a=1时,先执行b循环:
b=1,输出,然后b=2,输出,直到b=4时,输出,然后b=5条件2为假,退出循环2,执行换行输出,返回循环1,此时,a++.
当a=2时,先执行b循环:
b=1,输出,然后b=2,输出,直到b=4时,输出,然后b=5条件2为假,退出循环2,执行换行输出,返回循环1,此时,a++.
当a=3时,先执行b循环:
b=1,输出,然后b=2,输出,直到b=4时,输出,然后b=5条件2为假,退出循环2,执行换行输出,返回循环1,此时,a++.
a=4,不符合条件1,退出循环。
============================================================
5.2
多重循环程序设计案例
案例5.4
九九乘法表
【项目任务】
实现九九乘法表。
【设计思路】
实现九九乘法表的流程图如图5-3所示。
图5-3 九九乘法表流程图
【程序代码】
#include
main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%-3d",j,i,i*j);
printf("\n");
}
}
【运行结果】
1*1=1
1*2=2
2*2=4
1*3=3
2*3=6
3*3=9
1*4=4
2*4=8 3*4=12
4*4=16
1*5=5 2*5=10
3*5=15 4*5=20 5*5=25
1*6=6 2*6=12
3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14
3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16
3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9
2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
【知识拓展】
1.一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。
2.在一个循环体内如果有多个语句,应该用大括号括起来,这样就构成了复合语句。
案例5.5
金字塔图形
【项目任务】
输出以下图形。
*
***
*****
*******
*********
【设计思路】
从以上图形可以看出,每一行的星号数为该行行数乘以2再减1,每一行前面的空格数为5减去该行行数。用变量i控制行数,用变量j控制行前的空格数以及打印的星号数,循环5次。
【程序代码】
#include
main()
{
int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=5-i;j++)
printf(" ");
for(j=1;j<=2*i-1;j++)
printf("*");
printf("\n");
}
}
【运行结果】
*
***
*****
*******
*********
【知识拓展】
1.该程序中临时变量i和j不断地被重新赋值,原值均被新值所替代。
2.一般来说,对于输出图形的任务,只要认真找出其中的规律,按照规律来编写代码就相对容易了。
3.参照给出的案例,编写相应的程序代码,输出以下图形。
* * * * *
* * * *
*
* * * * *
* * * * *
* * * * *
案例5.6
杨辉三角形
【项目任务】
输出以下杨辉三角形(要求输出6行)。
1
1
1
1
2 1
1
3 3 1
1
4 6 4 1
1
5 10 10 5 1
【设计思路】
(1)杨辉三角形最本质的特征是:它的竖直边和斜边都是由数字1组成的,而其余数则是等于这个数正上一行与左上一行的两个数之和。从杨辉三角形的特点出发,可以总结出:第n行有n+1个值(设起始行为第0行)。
(2)对于第n行的第j个值:(n>=2)
① 当j=1或j=n+1时,其值为1。
②当j!=1且j!=n+1时,其值为第n-1行的第j-1个值与第j个值之和。
【程序代码】
#include
#define N 6
main()
{
int n,i,j,k,a[N][N];
for(i=0;i
{
a[i][0]=1;
a[i][i]=1;
}
for(i=2;i
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i
{
for(j=0;j<=i;j++)
printf("%-4d",a[i][j]);
printf("\n");
}
}
【运行结果】
1
1
1
1
2 1
1
3 3 1
1
4 6 4 1
1 5 10 10 5 1
【知识拓展】
1.本程序用到了二维数组,其定义的形式为:
类型说明符 数组名[常量表达式][常量表达式]
2.程序中,首先使用一个循环体对数组中代表杨辉三角形的两边赋值为1,第二个多重循环体的作用是对数组中代表杨辉三角形的非1数字进行计算和赋值。计算完毕后,值被存储在二维数组的相应位置,第三个多重循环体的作用是打印数组的值。