本帖最后由 09927306 于 2011-1-8 19:00 编辑
【例4-12】 从键盘输入1个整数,把这个整数中的各位数字反序显示出来。例如,输入为1234,则输出为4321。 所谓反序显示就是先显示个位数,再显示十位数……对任意整数x而言,可以用x%10求得其个位数,例如,1234%10=4。在此基础上,用x/10将x缩小10倍。例如,1234/10=123。这样,x就由原来的4位数变成了3位数。用同样的方法可以求得该3位数的个位数(实际上是原4位数的十位数),再将3位数缩小为2位数,直至1位数。在1位数的情况下,直接输出该数,整个问题就解决了。剩下的问题是如何判断x已经缩小为1位数,若x为1位数,必有x/10==0。因此,解决这个问题的基本思路是将大事化小,小事化了,每次循环要做的工作是求出x的个位数,将该个位数输出,然后将x缩小10倍。如果缩小后的x不等于0,就继续进入下一轮循环;否则,退出循环。程序如下:
- main()
- { int x,c;
- printf("Input an integer:");
- scanf("%d",&x);
- do
- { c=x%10;
- printf("%d",c);
- } while ((x/=10)!=0);
- printf("\n");
- }
复制代码
【例4-13】 打印九九乘法表。 如果用for循环的嵌套来实现,可以用外层循环控制被乘数i的变化,用内层循环控制乘数j的变化,内层循环的循环体要进行的操作是计算i*j,输出结果。外层循环的循环体包括整个内层循环及退出内层循环后才执行的printf("\n")语句。程序如下:
- main()
- { int i,j;
- for (i=1;i<=9;i++)
- { for (j=1;j<=9;j++)
- printf("%d*%d=%2d ",i,j,i*j);
- printf("\n");
- }
- }
复制代码
程序的执行过程是: (1)先对外层循环的循环变量i赋初值1,由于循环条件成立,执行外层循环的循环体,即进入内层循环; (2)在内层循环中,同样先对内层循环的循环变量j赋初值1,这时循环条件也成立,于是执行内层循环的循环体,即显示: 1*1=1 (3)修改循环变量j的值,使j=j+1,并判断循环条件仍然成立,继续执行循环体,显示:1*2=2 (4)重复执行(3),依次得到1*3=3,1*4=4,…,1*9=9,当j>9时退出内层循环,执行printf("\n"),使输出换行(注意,printf("\n")是外层循环的循环体,而不是内层循环的循环体)。然后第二次进入外层循环(即i=2),由于i<=9成立,于是又进入内层循环,内层循环变量j重新初始化为1,显示: 2*1=2,…… (5)如此反复,每一轮外层循环,都要重复执行内层循环9次,直到外层循环终止时,内层循环的循环体printf("%d*%d=%2d ",i,j,i*j)共被执行9*9=81次。而printf("\n")只是外层循环的循环体的一部分,共被执行9次。 程序输出结果如下:
1*1=1 1*2=2
1*3=3
1*4=4
1*5=5
1*6=6
1*7=7
1*8=8
1*9=9
2*1=2 2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16 2*9=18
……
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45
9*6=54
9*7=63
9*8=72 9*9=81
【例4-14】 用迭代法求正数x(2~100)的平方根。求平方根的迭代公式如下:
x1=(x0+x/x0)/2
要求迭代精度为0.00001。 所谓迭代,就是从初始值x0出发,用迭代公式计算x1,当|x1–x0|<ε时(ε称为迭代精度),迭代收敛,x1就是所求的根;否则,用x1替换x0,继续使用迭代公式,计算新的x1。
- #include <math.h>
- main()
- { float x,x0,x1;
- for(x=2; x<=100; x++)
- { x0=x/2;
- x1=(x0+x/x0)/2;
- do
- { x0=x1;
- x1=(x0+x/x0)/2;
- } while(fabs(x1-x0)>=1e-5);
- printf("%.0f %f\n",x,x1);
- }
- }
复制代码
程序中,外层for循环用来依次从2~100中选出一个数,内层do-while循环用来求该数的平方根。在求某数x的平方根时,用x/2作为迭代初值。利用迭代公式求出x1,这是第一次迭代过程,然后在do-while循环中进行反复迭代,直到两次迭代结果的绝对误差小于指定的迭代精度时,x1就是对应x的平方根。 【例4-15】 break在循环结构中的控制作用示例。
- main()
- { int t;
- for (t=0;t<100;t++)
- { printf("%d",t);
- if (t==10) break;
- }
- }
复制代码
如果程序中没有break语句,for循环将执行100次。由于break语句的存在,当t=10时,break被执行,程序流程被强迫退出循环,从而程序运行结束。程序运行结果为: 1 2 3 4 5 6 7 8 9 10 【例4-16】 continue在循环结构中的控制作用示例。
- main()
- { int i=0;
- while(i<100)
- { i++;
- if (i%5==0) continue;
- printf("%d",i);
- }
- printf("\n");
- }
复制代码
程序运行时,将100以内的自然数显示在屏幕上,但凡5的倍数均不显示。这是由于凡是遇到5的倍数时,在continue语句的作用下,程序流程跳过printf()语句,直接进入循环条件的测试。形象地说,continue是将它后面的循环体部分“短路”。
|