在介绍过顺序结构和选择结构以后,我们能通过c语言做的事依旧很少,比如换硬币问题。将一元的人民币换成一分,两分,五分的硬币共50枚。如何解决这样的问题呢?我们可以把它化解成一个求解线性方程组的问题。
可以设需要一分的硬币x枚,两分的硬币y枚,五分的硬币z枚。于是,我们可以得到一个方程组,像这样:x+y+z = 50,0.01x+0.02y+0.05z = 1。我们知道,计算机在计算浮点数的时候可能会出现精度问题。所以,我们
把方程组改写成x+y+z = 50,x+2y+5z = 100。
那么问题来了,如何用C语言来求解这样的一个方程组呢??我们知道x,y,z的取值范围,x不能超过100,y不能超过50,z不能超过20,并且它们都是自然数,即它们大于0且它们都是整数。我们可以在x,y,z的取值
范围里逐个枚举。当x+y+z = 50,x+2y+5z = 100时,输出x,y,z的值,这样,我们就得到了方程组的一个解。我们把这一过程用代码来实现。
1 #include <stdio.h> 2 3 int main(){ 4 printf("符合条件的x,y,z的取值如下: "); 5 for (int x = 0;x < 100;x++) { 6 for (int y = 0;y < 50;y++) { 7 for (int z = 0;z < 20;z++) { 8 if(x+y+z == 50 && 9 x+2*y+5*z == 100){ 10 printf(" 一分硬币%d枚,两分硬币%d枚,五分硬币%d枚 ",x,y,z); 11 } 12 } 13 } 14 } 15 return 0; 16 }
代码中,形如这样的语句被称为for语句,它后面的()内部的内容可以抽象为(表达式1;表达式2;表达式3)。其中表达式1为循环开始前要做的事情,
表达式2为循环的终止条件,表达式3为改变循环条件变量的语句。整个循环可以这样用算法框图表示。
在我们的代码内,出现的是一个三重循环,对于三重循环,我们可以这样理解,将第一重循环的循环体换成一个循环,在将第二重循环的循环体换成一个循环。嵌套循环可以这样用算法框图表示。
这里,我们用算法框图表示了一个二重循环。如果想要把它改为一个三重循环。只需要将内循环的循环体改成一个循环,这样就是一个三重循环了。
了解了for循环以后,循环语句有什么用呢??我们知道,计算机做的事情,一般都是可重复的,可重复的过程,一般都可以让计算机代劳。解方程的过程可以通过枚举,从而得到方程的解。所以,循环在计算机科学里的地位是不可忽视的,大部分的算法都基于循环,所以
如何使用循环解决问题。是一件值得多多研究的事情。现在。我们用循环来解决打印乘法表的问题,要求是:在控制台打印出九九乘法表。像这样:
这样一个操作对应的代码段可以是这样:
#include <stdio.h> int main(){ for (int i = 1;i <= 9;i++) { for (int j = 1;j<= i;j++) { printf("%d x %d = %d ",j,i,i*j); } printf(" "); } printf("--------------------------------------我是分割线------------------------------------ "); for (int i = 9;i >= 1;i--) { for (int j = 1;j<= i;j++) { printf("%d x %d = %d ",j,i,i*j); } printf(" "); } return 0; }
乘法表的打印是逐行打印的,一行一行的打印。每一行都需要打印,所以,循环应该是一个二重循环,外循环负责逐行打印。内循环负责在每一行进行打印。
循环语句的功能是非常强大的,大部分程序都含有循环。使用,笔者也只能挑一部分常见的循环应用来描述循环。