第四课

一、循环

1.while循环

正整数的位数

while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int x;
int n = 0;

scanf("%d", &x);

n ++;
x /= 10;
while ( x > 0 ) {
n ++;
x /= 10;
}

printf("%d", n);

return 0;
}

(可以处理0)

等同于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
int x;
int n = 0;

scanf("%d", &x);
while ( x > 0 ) {
n ++;
x /= 10;
}

printf("%d", n);

return 0;
}

(不可以处理0)

①如果我们把while翻译作“当”,那么一个while循环的意思就是︰当条件满足时,不断地重复循环体内的语句。

②循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。

③条件成立是循环继续的条件。

2.do-while循环

while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int x;
int n = 0;

scanf("%d", &x);

n ++;
x /= 10;
while ( x > 0 ) {
n ++;
x /= 10;
}

printf("%d", n);

return 0;
}

等同于

do-while

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
int x;
scanf("%d", &x);
int n = 0;
do {
x /= 10;
n ++;
} while ( x > 0 );

printf("%d", n);

return 0;
}

结构

1
2
3
do {
<循环体语句>
} while (<循环条件>);

※while结尾有;

do-while循环和while循环很像,区别是在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。

二、应用

1.猜数游戏

①让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉用户它猜了多少次。

②因为需要不断重复让用户猜,所以需要用到循环。

③在实际写出程序之前,我们可以先用文字描述程序的思路。

④核心重点是循环的条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdio.h>
#include <time.h>

int main()
{
srand(time(0));
int number = rand()%100+1;
int count = 0;
int a = 0;
printf("我已经想好了一个1到100之间的数。");
do {
printf("请猜这个1到100之间数:");
scanf("%d", &a);
count ++;
if ( a > number ) {
printf("你猜的数大了。");
} else if ( a < number ) {
printf("你猜的数小了。");
}
} while (a != number);
printf("太好了,你用了%d次就猜到了答案。\n", count);

return 0;
}

2.算平均数

①让用户输入一系列的正整数,最后输入-l表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数。

②—个记录读到的整数的变量。

③只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿它去除读到的数的个数就可以了。

④—个变量记录累加的结果,一个变量记录读到的数的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int number;
int sum = 0;
int count = 0;

do {
scanf("%d", &number);
if ( number != -1) {
sum += number;
count ++;
}
} while ( number != -1 );

printf("%f\n", 1.0*sum/count);

return 0;
}

等同于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main()
{
int number;
int sum = 0;
int count = 0;

scanf("%d", &number);
while ( number != -1 ) {
sum += number;
count ++;
scanf("%d", &number);
}

printf("%f\n", 1.0*sum/count);

return 0;
}

3.循环计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
int x;
int ret = 0;

scanf("%d", &x);
while ( x > 1 ) {
x /= 2;
ret ++;
}
printf("log2 of %d is %d.", x, ret);

return 0;
}

等同于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
int x;
int ret = 0;

scanf("%d", &x);
int t = x;
while ( x > 1 ) {
x /= 2;
ret ++;
}
printf("log2 of %d is %d.", t, ret);

return 0;
}

计算之前先保存原始的值,后面可能有用(小套路)

※如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后作出判断

4.整数逆序

整数的分解

①一个整数是由l至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算

②对一个整数做%10的操作,就得到它的个位数;对一个整数做/10的操作,就去掉了它的个位数

③然后再对2的结果做%10,就得到原来数的十位数了

④依此类推

数的逆序:输入一个正整数,输出逆序的数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int x;
scanf("%d", &x);

int digit;
int ret = 0;

while ( x > 0 ) {
digit = x%10;
ret = ret*10 + digit;
x /= 10;
}

printf("%d", ret);

return 0;
}