循环的例子
Suzhou 505 0
计算log2x的值
#include <stdio.h>

int main()
{
    printf("计算log2x");
    int x;
    printf("输入x的值\n");
    scanf("%d",&x);
    int ret = 0;/*ret为log2x的计算结果*/
    while (x > 1){
        x /= 2;
        ret ++;
    }
    printf("当x=%d时log2x的值为%d",x,ret);
    return 0;
}
计算log2x输入x的值
64
当x=1时log2x的值为6
--------------------------------
Process exited after 2.149 seconds with return value 0

上述程序从计算结果可以看出并不合理,原因是x的值在while循环中不断变化,而程序最后输出时需要使用x的初始值,需要在程序进入while循环前将x的值保存下来,如下:

#include <stdio.h>

int main()
{
    printf("计算log2x");
    int x;
    printf("输入x的值\n");
    scanf("%d",&x);
    int t = x;
    int ret = 0;/*ret为log2x的计算结果*/
    while (x > 1){
        x /= 2;
        ret ++;
    }
    printf("当x=%d时log2x的值为%d",t,ret);
    return 0;
}
计算log2x输入x的值
64
当x=64时log2x的值为6
--------------------------------
Process exited after 2.046 seconds with return value 0

::: tip 上述程序中ret的起始值和循环条件如何确定: 当x的值为0时,log2x不存在;当x的值为1时,log2x即ret值为0(2的0次方等于1),即当x的值为1时,程序不要进入循环,直接输出ret的起始值0;当x的值为2时,log2x的值希望为1,需要进入循环中执行一次ret++,即x=2是希望进入循环的最小数字,由此可得循环条件也可由x>改为x>=2。当循环条件改为x>2时,即当x=2时不进入循环还要保证ret的值为1,ret起始值应该为1,(即x=2时log2x的值为1),但为了兼顾当x=1时,ret结果为0,循环条件应改为x>1或x>=2。 当循环条件是x>0时,数学上x不可能为0,当x=1进入循环后,x/=2后x等于0(取整),ret++,而当x=1时,ret=0,所以此时ret的起始值应为-1。 ::: 上述程序中当循环条件是x>0,ret起始值为-1时,程序如下:

#include <stdio.h>

int main()
{
    printf("计算log2x");
    int x;
    printf("输入x的值\n");
    scanf("%d",&x);
    int t = x;
    int ret = -1;/*ret为log2x的计算结果*/
    while (x > 0){
        x /= 2;
        ret ++;
    }
    printf("当x=%d时log2x的值为%d",t,ret);
    return 0;
}

计算结果当x=2时ret=1,当x=1时ret=0,也满足了程序计算要求。 ::: warning 程序没有确定的标准答案,编程问题可以有不同的解决方法。 :::


计数循环
#include <stdio.h>

int main()
{
    int count = 3;
    while (count > 0){
        count --;
        printf("%d\n",count); 
    }
    printf("发射!\n"); 
    printf("count值为%d",count);
    return 0;
}

对计数程序提出三个问题: 1、count起始值100和循环条件count>0之间的关系怎么影响循环次数? 2、循环停止时会不会输出0? 3、循环结束时,count值是多少? 上述问题可以通过debug、循环体内添加printf语句、纸面模拟输出程序来直观解决。 需要计算重复运算量过大的循环,可以模拟较少的运算次数然后推断结果。

2
1
0
发射!
count值为0
--------------------------------
Process exited after 0.01696 seconds with return value 0

如上计算当count=3时程序的输出结果,得到结论:程序执行3轮,结果会输出0,循环结束count值为0。可以推断出当count=100时:程序执行100轮,结果会输出0,循环结束count值为0。


计算平均数

计算平均数时,需要将所有的数字相加。程序读入一系列正整数,读到-1表示正整数读完了(要读入的正整数的数量未知),程序将所有读入的正整数都加起来,除以读入正整数的个数n,需要引入一个计数器,在每次读到一个正整数时计数器加1,最后输出输入数字的个数和平均数。 ::: tip 思考过程:变量——>算法——>流程图——>程序 :::

  • 变量:①需要一个记录所读入的数字的变量。②求平均数时不需要将每一个读入的数字都用一个变量保存,可以用一个变量把每次读到的数字都加起来,每次读入一个数字,就把相加后的结果保存在累加和的变量sum中。③需要有一个变量在每读入一个数字时加一,计算读入的数字的个数。
  • 算法:
    1. 初始化变量sum和count为0;
    2. 读入number;
    3. 如果number不是-1,则将number加入sum,并将count+1,回到步骤2。
    4. 如果number是-1,则计算打印和sum/count的值(转换为浮点数计算)。

流程图如下: 循环的例子

#include <stdio.h>

int main()
{
    int number;
    int sum = 0;
    int count = 0;
    printf("请输入数字");
    scanf("%d",&number);
    count++;
    printf("共输入数字%d个\n",count);
    if (number != -1){
        do
        {
            sum += number;
            printf("输入数字总和为%d\n",sum);
            printf("请输入数字");
            scanf("%d",&number);
            count++;
            printf("共输入数字%d个\n",count);
        }while(number != -1);
    }
    count --;
    printf("平均数为%f\n",1.0*sum/count);
    return 0;
}
请输入数字3
共输入数字1个
输入数字总和为3
请输入数字2
共输入数字2个
输入数字总和为5
请输入数字1
共输入数字3个
输入数字总和为6
请输入数字0
共输入数字4个
输入数字总和为6
请输入数字-1
共输入数字5个
平均数为1.500000

--------------------------------
Process exited after 1.829 seconds with return value 0

另一种程序写法:

#include <stdio.h>

int main()
{
    int number;
    int sum = 0;
    int count = 0;
    do 
    {
        printf("请输入:\n");
        scanf("%d",&number);
        if (number != -1){
        sum +=number;
        count ++;
        }
    }
    while (number != -1);
    printf("平均数为%f\n",1.0*sum/count);
    return 0;
}
请输入:
3
请输入:
2
请输入:
1
请输入:
0
请输入:
-1
平均数为1.500000

--------------------------------
Process exited after 2.74 seconds with return value 0

使用while循环优化程序:

#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
2
1
0
-1
平均数为1.500000

--------------------------------
Process exited after 3.128 seconds with return value 0

可以省略一步判断的程序。


猜数游戏

要求:计算机提出一个数字,用户来猜,用户每输入一个数字计算机告诉用户数字大了或小了,直到用户猜对,告诉用户猜了多少次。 文字描述程序: ①计算机随即提出一个数字,记在变量number中; ②变量count负责统计次数,初始为0; ③用户输入数字a; ④count递增; ⑤判断a和number的大小关系,a大输出“大”,a小输出“小”; ⑥当a不等于number时,程序回到第三步(循环条件); ⑦当a等于number时,程序输出“猜中”并出输出用户猜的次数; ⑧程序结束。

#include <stdio.h>
#include <stdlib.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("你猜的数大了。\n");
        }else if ( a < number ) {
            printf("你猜的数小了。\n");
        }
    }
    while (a != number);
    printf("太好了,你用了%d次就猜到了答案。\n",count);
    return 0;
}
我已经想好了一个1到100之间的数。请猜这个1到100之间数:50
你猜的数大了。
请猜这个1到100之间数:15
你猜的数小了。
请猜这个1到100之间数:20
太好了,你用了3次就猜到了答案。

--------------------------------
Process exited after 6.435 seconds with return value 0

::: tip rand()是C语言标准库中的函数,可以产生随机整数。 #include <stdlib.h>和#include <time.h>是为了srand(time(0))和rand()而出现。 ::: srand(time(0))和rand()可以得到每次运行都不一样的随机数字。如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(0));
    int number = rand();
    printf("%d",number);
    return 0;
}
17021
--------------------------------
Process exited after 0.01238 seconds with return value 0
17067
--------------------------------
Process exited after 0.0138 seconds with return value 0

::: tip rand()%100+1用来取得一个>=100的数字。 计算机给出的随机数比较大,可以使用%取余。 (x%n的结果是[0,n-]之间的一个整数。) :::

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(0));
    int number = rand();
    number = 1234;
    printf("%d",number%100);
    return 0;
}
34
--------------------------------
Process exited after 0.01677 seconds with return value 0

循环类型使用do-while循环,原因是无论怎样都需要进入循环让用户输入一个数字,判断结束时又需要判断是否要继续循环,do-while循环比while循环更加合理。


整数逆序

一个整数是由1到多位数字组成的,分解整数的方法: ①对一个整数做%10的操作,就得到它的个位数; ②对一个整数做/10的操作,就去掉了它的个位数; ③再对2的结果做%10,就得到原来数的十位数,以此类推。

#include <stdio.h>

int main( )
{
    int x;
    x = 12345;
    int digit;
    int ret = 0;
    while ( x > 0 ) {
        digit = x%10;
        printf("%d\n" , digit);
        ret = ret*10 + digit;
        printf( "x=%d,digit=%d,ret=%d\n",x,digit,ret);//调试
        x /= 10;
    }
    printf("%d", ret);
    return 0;
}

变量ret表示输出结果,变量digit表示每一位的数字,digit = x%10取出数字最右边的一位,x /= 10丢掉最右边的一位,ret = ret*10 + digit表示原来的结果向左移一位加上digit,构建新的数字。

5
x=12345,digit=5,ret=5
4
x=1234,digit=4,ret=54
3
x=123,digit=3,ret=543
2
x=12,digit=2,ret=5432
1
x=1,digit=1,ret=54321
54321
--------------------------------
Process exited after 0.02004 seconds with return value 0

按照上述程序,输入x = 700,输出结果会是个7而不是007,需要根据具体要求修改,使程序每次循环都输出digit:

#include <stdio.h>

int main( )
{
    int x;
    x = 700;
    int digit;
    int ret = 0;
    while ( x > 0 ) {
        digit = x%10;
        printf("%d" , digit);
        ret = ret*10 + digit;
        x /= 10;
    }
    return 0;
}
007
--------------------------------
Process exited after 0.01898 seconds with return value 0
评论区

索引目录