让计算机数数:
问123812843267518273618273612675317 是几位数?
怎样让计算机来数数?
思路:
1.让计算机从右边开始数
2.对10做整除
3.不停的对10整除,直到不能整除10
while 循环
# include<stdio.h>
int main ()
{
int a,n = 0;
printf("请输入一个数\n");
scanf("%d",&a);
while(a>+0)
{
n++;
a/= 10;
}
printf("你输入的数有%d个数字\n", n);
return 0;
}
对比上面的两个程序,你认为哪个好一点?
do - while 循环
while 是先进行判断,再执行循环体。do-while是先执行循环体,再进行判断。
# include<stdio.h>
int main ()
{
int a,n = 0;
printf("请输入一个数\n");
scanf("%d",&a);
do
{
n++;
a/= 10;
} while(a>0);
printf("你输入的数有%d个数字\n", n);
return 0;
}
for循环
for(初始条件;循环条件;循环每轮的动作)
{
......
}
用for写死循环:
for(;;)
{
......
}
for 的死循环 和 while 写的死循环,编译器的优化是不一样的。for 写的死循环优化 比while 循环要好很多。
for(;条件;) == while (条件)
循环的选用大致可以参考一下建议:
1.循环固定次数,用 for循环
2.如果必须执行一次,用do-while
3.其他情况用while
循环之间基本是可以互换的。
例子:如何用1角、2角、5角的硬币凑出10元以下的金额呢?
# include<stdio.h>
int main ()
{
int x;
int one ,two,five;
scanf("%d",&x);
for (one = 1;one < x*10;one ++){
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;
}
如果得到一种结果后就跳出循环该怎么办?
”连锁 break“
# include<stdio.h>
int main ()
{
bool exit = 0;
int x;
int one ,two,five;
scanf("%d",&x);
for (one = 1;one < x*10;one ++){
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)
break;
}
if (exit)
break;
}
return 0;
}
不常用的goto:用goto来跳出嵌套循环
# include<stdio.h>
int main ()
{
int x;
int one ,two,five;
scanf("%d",&x);
for (one = 1;one < x*10;one ++){
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;
}
}
}
}
out: return 0;
}
break vs continue
当想要中止当前循环时,用 break,循环停止,执行循环体后面的代码。
continue 是跳过当前循环,执行下一次循环。
辩证看待 goto
可以考虑使用goto的情形:1.从多重循环中直接跳出 ;2. 出错时清除资源; 3.可增加程序的清晰度的情况。
下列关于使用goto语句的原则可以供读者参考。 1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。 2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。 3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。 4)应该避免像两个方向跳转。这样最容易导致"面条代码"。