还是用一个程序的题目来展开这一节:
凑硬币:
如何用1角、2角、5角的硬币凑出10元以下的金额呢?
我们来看一下,三个for循环的代码:
#include<stdio.h>
int main()
{
int x;
int one, two, five;//这块设定3个变量,分别来计算1角、2角、5角的每个的个数是多少。
scanf_s("%d", &x);
for (one = 1; one < x * 10; one++)
{//这块的判定结束的是把要换的钱,全部换成1角、2角、5角。
for (two = 1; two < x * 10 / 2; two++)
{
for (five = 1; five < x * 10 / 5; five++)
{
if (one + two * 2 + five * 5 == x * 10)
{//判断是否可以满足。
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n", one, two, five, x);
}
}
}
}
return 0;
}
题目改变一下:我们只要求输出一次3种硬币的组合就可以了,这个时候可以终止循环了。
注意,break和continue的使用条件是只能跳出它所在的那一个循环,如果外面还有更多的循环,那样的话,就再跳不出去了。
我们这边还是使用跟前面几乎一样的方法来进行处理,就是,设定一个变量,当钱数可以表示的时候,这个变量被赋值,然后在后面的每一个循环的结束之前,加上一个if的条件语句,如果满足这个条件的话,那就执行这一重循环的break的语句。
我们再来看一下这个代码 :
#include<stdio.h>
int main()
{
int x;
int exit = 0;
int one, two, five;//这块设定3个变量,分别来计算1角、2角、5角的每个的个数是多少。
scanf_s("%d", &x);
for (one = 1; one < x * 10; one++)
{//这块的判定结束的是把要换的钱,全部换成1角、2角、5角。
for (two = 1; two < x *10 /2; two++)
{
for (five = 1; five < x * 10 / 5; five++)
{
if (one + two * 2 + five * 5 == x * 10)
{//判断是否可以满足。
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n", one, two, five, x);
exit = 1;
break;
}
}
if (exit)//这个就相当于if(exit==1),这个很重要,要记住,后面会用上。
{
break;
}
}
if (exit)//这边添加一个笔记,当if()括号里面的数不为0的时候,就进入这个条件里面的语句中。
{//当然上面所说的也不是仅仅是if,其他的if、else if、else都可以。
break;
}
}
return 0;
}
上面这个称之为:接力break.
当然我们还有其他的方法:
用goto函数,这个函数的具体的用法在下面的代码的注释里面有:
#include<stdio.h>
int main()
{
int x;
int one, two, five;//这块设定3个变量,分别来计算1角、2角、5角的每个的个数是多少。
scanf_s("%d", &x);
for (one = 1; one < x * 10; one++)
{//这块的判定结束的是把要换的钱,全部换成1角、2角、5角。
for (two = 1; two < x *10 /2; two++)
{
for (five = 1; five < x * 10 / 5; five++)
{
if (one + two * 2 + five * 5 == x * 10)
{//判断是否可以满足。
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n", one, two, five, x);
goto out;//注意,这个goto语句由两个部分组成,前面的是goto out,前面是函数,后面是要到的地方的标号。
}
}
}
}
out://这里表达的第二个语句就是,上面这个函数跳转的地方。注意这个的后面有一个分号。
return 0;
}
当前只在有多重循环的地方使用goto,这样才能使整个程序更有逻辑感,不必像一个传送门一样来回的飘动。