|
初学编程的时候(学到循环)遇到一个比较典型的问题:就是如何打印菱形,如下图:
*
***
*****
*******
*********
*******
*****
***
*
我们当然不能用printf来一行行打印,这样多笨,再说也为了理解for循环的意思,我 们干脆用for 循环来打印菱形。我们先来思考一个简单点的问题,比如要打印:
*
**
***
****
*****
我们怎么用for来实现呢?可以用一个for循环来打印多少行,一个for来打印星号就可以了。给出源程序如下:
#include <stdio.h>
//#include <conio.h>
main()
{
int i,j;
//clrscr();
for(i=1;i<=5;i++){
for(j=1;j<=i;j++)
printf("*");
printf("\n");}
}
也就是说一个for做了一件事情,虽然我们的菱形复杂得多,但我们认真在纸上划划分析一下,就不难发现规律:从第一行到第5行,星号得数目一直在增加,而到了第6行却开始减少。而且星号和两边的空格减少都是有规律可循的。再分析一下,我们要打印每 行星号前面的空格不难,打印后面的空格却麻烦,但我们可以通过打印前面的空格和控 制好星号的数目来完成菱形的打印(忽略每行星号后的空格),眉头一皱,计上心来:) 完成这个任务分两步:一是打印前5行,用两个for来控制星号和空格;二是打印后4行, 同样是用两个for来控制星号和空格。一共是6个for! 进一步缕清思路,在前5行,i from 1 to 5(用来控制行),j from 4 to 0(用来控制 空格,因为要先打印空格),k from 1 to 9(用来控制星号,变化规律是从1到9);再来写后面的4行:m from 1 to 4,n from 1 to 4,o from 7 to 1。再求精:前5行,分 析变化规律:
i j k
1 4 1
2 3 3
3 2 5
4 1 7
5 0 9
我们要找,当i=1时,j=4,k=1......再用数学的方法思考:使当i等于1的时候j等于4, i等于2的时候j等于3......i等于5的时候,j等于0。比如我们可以用2n+2=4(n=1),下个呢?因为我们要找递归关系(所以习惯用n )2n+2-3=3(n=2),2n+2-6=2(n=3),2n+2-9=1 (n=4),2n+2-12=0(n=5)满足了i和j的关系!再发现:(2n+2)后的每个数都是有规律的! 0,3,6,9,12!都是3的倍数!我们终于找到了递归关系:(2n+2)-3(n-1),n属于[1, 5],化简得5-n。以此类推,完成了所有的递归关系!你疑惑地问,我不用2n+2找递归 关系,用n+3找,或者用3n+1,或用4n,你可以试试,结果都是一样地,那用哪个最方便?当然是(n+3)-2(n-1) n属于[1,5],记住咱们地推论了!费那么大工夫,终于完成 了如下的源程序:
main()
{
int i,j,k,m,n,o;
clrscr();
for(i=1;i<=5;i++){
for(j=1;j<=5-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");}
for(m=1;m<=4;m++){
for(n=1;n<=m;n++)
printf(" ");
for(o=1;o<=9-2*m;o++)
printf("*");
printf("\n");}
}
我们看变量的定义多了,去掉m,n,o:
#include <stdio.h>
//#include <conio.h>
main()
{
int i,j,k;
//clrscr();
for(i=1;i<=5;i++){
for(j=1;j<=5-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printf("\n");}
for(i=1;i<=4;i++){
for(j=1;j<=i;j++)
printf(" ");
for(k=1;k<=9-2*i;k++)
printf("*");
printf("\n");}
}
*****************上面所有的源程序在turbo c 2.0编译下通过!*********************************** 我当初学的时候可是迷茫了很久啊,现在终于懂了!对于打印菱形什么的,我再也不会迷茫了! 总结:我们通过这个程序学到了什么?
一是不要看老谭(谭浩强)写的程序而非要和他 写的一模一样!我们要自己动脑找规律。不要迷信他人,我们自己慢慢也能写出程序!以后读任何人的程序都是一样,先自己想程序的要实现的功能,自己写写看,实在不行 再看他的程序,如果一次理解不了就多来几回!一直到我们自己对这个程序的思想能把 握了为止!