8 月 7 日上课内容:while 循环,循环嵌套。
while 循环
在这之前相信大家已经初步了解过 while
循环,他和 for
循环的最大区别就在于 while
循环是解决一些不知道明确执行次数的一个循环类型,他可以解决(简化)一些 for
循环的功能,不过 while
循环也可以用 for
循环表示。我们先用 for
循环实现以下功能:
输入一个数 n,求出数 n 的位数。
我们可以用 n 不断地除以十,使每次循环时可以减掉 n 的一位,最后再在循环循环末尾用 if
判断 n 是否为 0 就行。注:x(0<x<10)/10=0
。
此时的我们不知道明确的循环次数,所以 for
循环里的第二个格子该怎么写呢?首先我们来回顾一下 for
循环里的三个格子里的作用。
for(循环开始执行语句;循环条件;循环结束执行语句);
由此可见 for
循环里的第二个格子是用来做循环条件的。由于我们是在循环末尾放的 if
语句判断,如果为 0 就输出并跳出循环,所以我们可以让他无限执行,所以在循环条件里填 1(非 0 及真),即可每次读到此语句的时候就执行。所以我们可以这样写:
for(int i=1;1;i++){
n=n/10;
if(n==0){
cout<<i;
break;
}
}
有的同学可能想到了,既然 for
循环里的第二个格子是循环条件,那还不如把循环条件里写成 n!=0
。于是我们运行以下程序发现:
int i;//定义成全局变量不然不能再 for 循环外使用。
for(i=1;n!=0;i++){
n=n/10;
}
cout<<i;
输入:123
。
输出:4
。
这是为什么呢?原来,i++
语句是在每次循环结束无脑执行的语句,当第一次循环运行的时候,i
的初始值为 1
,再循环结束时 i 又加了 1
,所以 i 的值会被多加一次,我们只需将 i 的初始值改为 0 就行,以至于为什么之前提到的程序里没有多加,是因为 if
语句是在 i++
语句执行前执行的,在 n=0 时过滤掉了 i++
并直接输出了,所以不会多算。
而我们今天要学的就是简化这种循环,以示更加简结、明了。
while
循环结构:
while(满足条件执行);
所以将 n!=0 语句放入 while
循环里就行了:
int i=0;
while(n!=0){
n=n/10;//减掉一位
i++;//计数
}
cout<<i;
//上面的程序大意:发现一位计一位。
这样我们就可以更简洁的表示“读取 n 的位数”的效果啦。
while 循环进阶用法
题目:请用 while
循环倒序输出 n(n<0<1000)
。
我们知道 %
(mod) 运算的特性:n%10
。取出 n 的最后一位。将值赋值给答案变量,这里用 ans 表示,因为有着仅为关系,所以在每次计算时,都要将 ans 乘 10
,以便将各位留给下一位。
n | ans | 代码 |
---|---|---|
123 | 0 | - |
123 | 3 | ans=ans+n%10 |
12 | 3 | n=n/10 |
12 | 30 | ans=ans*10 |
12 | 32 | ans=ans+n%10 |
1 | 32 | n=n/10 |
1 | 320 | ans=ans*10 |
1 | 321 | ans=ans+n%10 |
0 | 321 | n=n/10 |
以上表格便于大家理解。
至此,我们发现规律:
ans=ans*10;ans=ans+n%10;n=n/10;
将次程序写进 while
:
int ans=0;
while(n!=0){
ans=ans*10;
ans=ans+n%10;
n=n/10;
}
cout<<ans;
所以,倒序输出 n 的题目被我们轻而易举的完成了。
循环嵌套
如果我们要实现逆序输出 10 到 99 中的所有数的话,我们就需要用到 for
套 while
:
for(int i=10;i<=99;i++){
int ans=0,n=i;
while(n!=0){
ans=ans*10;
ans=ans+n%10;
n=n/10;
}
cout<<ans<<endl;
}
这样我们就完美学会了循环嵌套的入门知识。