zoukankan      html  css  js  c++  java
  • C语言之while循环

    while循环能做什么???

    • 先来个概念格式,while循环的一般形式为:
    while(表达式){
        语句块
    }
    

    意思是,先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
    看这段话你可能会有很多疑问,不过不重要,只要记住那个格式就行,因为上面那段话是官方阐述。通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。其实就是符合条件就进行大括号里的内容,不符合条件,无视它就好。

    • 看个例子,用 while 循环计算1加到100的值:
    #include <stdio.h>
    int main(){
        int i=1, sum=0;
        while(i<=100){
            sum+=i;
            i++;
        }
        printf("%d
    ",sum);
        return 0;
    }
    

    运行结果:

    5050
    

    代码分析:

    1. 程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。

    2. 接下来会继续判断 i<=100是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为3。

    3. 重复执行步骤 2)。

    4. 当循环进行到第100次,i 的值变为 101,sum 的值变为5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码。

    while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。

    如果循环条件中不包含变量,会发生什么情况呢?

    1. 循环条件成立时的话,while 循环会一直执行下去,永不结束,成为“死循环”。例如:
    #include <stdio.h>
    int main(){
        while(1){
            printf("1");
        }
        return 0;
    }
    
    • 运行程序,会不停地输出“1”,直到用户强制关闭。
    1. 循环条件不成立的话,while 循环就一次也不会执行。例如:
    #include <stdio.h>
    int main(){
        while(0){
            printf("1");
        }
        return 0;
    }
    
    • 运行程序,什么也不会输出。

    下面来练习一下!!!

    • 如果要打印1~100该咋办?这个问题可能很简单。
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        system("color 0a");//输出的背景为黑底绿字,可删
        int i=1;
        while(i<=100){
            printf("%d
    ",i);
            i=i+1;
        }
        return 0;
    }
    
    • 如果要到着输出100到1呢?
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        system("color 0a");
        int i=100;
        while(i>0){
            printf("%d
    ",i);
            i=i-1;
        }
        return 0;
    }
    
    • 如果要输出1~100的偶数呢?
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        system("color 0a");
        int i=2;
        while(i<=100){
            printf("%d
    ",i);
            i=i+2;
        }
        return 0;
    }
    
    • 再来个难的,输出1~100后再从100输到1。
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        system("color 0a");
        int i=1;
        while(i<100){
            printf("%d
    ",i);
            i=i+1;
        }
        while(i>0){
            printf("%d
    ",i);
            i=i-1;
        }
        return 0;
    }
    

    所以,循环(Loop),就是重复地执行同一段代码,例如要计算 1+2+3+……+99+100 的值,就要重复进行99次加法运算。


    通过上述对while有个基本了解,但如何用计算机输出1~100中所有不能被3整除的数,例如1,2,4,5……,97,98,100。


    通过上述,其实可以让a从开始每次增加1就可以。如果想每次遇到3的倍数就不打印,只需每次对a进行判断就好,即当a为3或3的倍数就不输出,否则就输出。
    那具体该如何做?

    我们只需要通过if语句来判断变量a的值除以3的余数是否为0就可以了。如果余数不为0,说明变量a中的值不是3的倍数,就将变量a中的值打印出来;否则就说明变量a中的值是3的倍数,不能打印。

    那么,怎么判断变量a中的值除以3的余数是否为0呢,需要使用“%”这个运算符。在第3章中我们介绍过,“%”读作mod,也可以称之为“取模”,作用就是获取余数。另外说一下“%”这个运算符的左右两边必须为整数。而“/”这个符号表示除号,作用是获取商,“/”这个运算符的左右两边既可以是整数也可以是小数。

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1;
        while(a<=100){
            if(a%3!=0){
                printf("%d
    ",a);
            }
            a++;
        }
        return 0;
    }
    
    • 如果要输出1~100中能被3整除但是不能被5整除的所有数,又该怎么办?
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1;
        while(a<=100){
            if(a%3==0 && a%5!=0){
                printf("%d
    ",a);
            }
            a++;
        }
        return 0;
    }
    
    • 更复杂的来了!现在我想知道1~100中有多少这样的数,请你写这样一个程序,输出1~100中所有7的倍数和末尾含7的数。
    • 很简单,我们先参照以往的程序,利用while循环,让变量a从1递增到100,不过我们每次在输出变量a的值之前需要对变量a进行判断。根据题目的要求,如果变量a的值是7的倍数或者末尾含有7就打印出来。判断一个变量是否为7的倍数我们已经很熟悉了,只需要判断变量a除以7的余数是否为0就可以,即如果a%7==0这个关系表达式成立就输出。那怎么判断变量a的值末尾是否含7呢?我们仔细想一想就会发现末尾含7的数其实就是这个数的个位为7,也就是这个数除以10的余数为7。发现这个规律就好办了,即在a%10==7这个关系表达式成立时输出就可以啦。
    • 好了,现在有两个关系表达式a%7==0a%10==7,分别表示这个数是否为7的倍数以及末尾是否含7。这两个式子是“或者”的关系,只要有一个成立,就将这个数输出。这里的逻辑关系“或者”在C语言中的表示方法用“||”表示,
    • 所以,代码如下:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1;
        while(a<=100){
            if(a%7==0 || a%10==7){
                printf("%d
    ",a);
            }
            a++;
        }
        return 0;
    }
    

    那如何求和呢?

    • 可能你会说,一直加就好,比如在求1~100的和之前,我们先来解决如何求1+2+3的值。
      没错,你可以这样写:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a;
        a = 1+2+3;
        printf("%d", a);
        system("pause";
        return 0;
    }
    
    • 但如果是1~100的话,这样不会很麻烦吗?可以换一种方式,比如:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a;
        a = 0; //想一想为什么a的初始值要为0呢?
        a = a+1;
        a = a+2;
        a = a+3;
        printf("%d", a);
        return 0;
    }
    

    你可能会说这样写岂不是更麻烦……但是我们发现在上面的这段代码中,a=a+1; a=a+2;a=a+3;这三句话,基本思想是相同的,第一次加1,第二次加2,第三次加3。我们可以把这三个语句用a=a+i;来表示。然后让变量i从1到3循环就可以了。

    • 代码如下:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a, i;
        a = 0;
        i = 1;
        while(i< = 3{
            a = a+i;
            i = i+1;
        }
        printf("%d", a);
        return 0;
    }
    
    • 如果需要计算1~100的和,我们只需将上面代码中i<=3修改为i<=100就可以了,代码如下:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a, i;
        a = 0;
        i = 1;
        while(i< = 100{
            a = a+i;
            i = i+1;
        }
        printf("%d", a);
        return 0;
    }
    
    • 如果求1~100中所有7的倍数或者末尾含7的数的总和,又该怎么办呢?其实是一样的:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a, i;
        a = 0;
        i = 1;
        while(i<= 100)
        {
            if(i%7 == 0 || i%10 == 7) {
                a = a+i;
            }
            i = i+1;
        }
        printf("%d", a);
        return 0;
    }
    
    • 求1~100所有偶数的和
    #include <stdio.h>
    #include <stdlib.h>
    int main(){
        system("color 0a");
        int i=0,a=0;
        while(i<100){
            a=a+i;
            i=i+2;
        }
        printf("%d",a);
        return 0;
    }
    
    • 输入一个整数n,求n的阶乘
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        system("color 0a");
        int i=1,a=1;
        int n;
        scanf("%d",&n);
        while(i<=n){
            a=a*i;
            i=i+1;
        }
        printf("%d",a);
        return 0;
    }
    
    • 请尝试编写一个两分钟的倒计时。形如:2:00 1:59 1:58 …… 1:00 0:59 0:58 …… 0:02 0:01 0:00
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    int main()
    {
        int i,j=0;
        scanf("%d",&i);
        while(i>=j){
            system("cls");
            printf("%2d:%2d
    ",i/60,i-i/60*60);
            Sleep(1000);
            i--;
        }
        return 0;
    }
    
    • 打印三行,每行5个“*”
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1;
        while(a<=15){
            printf("*");
            if(a%5==0){
                printf("
    ");
            }
            a++;
        }
        return 0;
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1,b;
        while(a<=3){
            b=1;
            while(b<=5){
                printf("*");
                b++;
            }
            printf("
    ");
            a++;
        }
        return 0;
    }
    
    • 想一想,如果想要完成这样的图形该怎么办?
    *
    **
    ***
    ****
    *****
    
    • 具体代码:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1,b;
        while(a<=5){
            b=1;
            while(b<=a){
                printf("*");
                b++;
            }
            printf("
    ");
            a++;
        }
        return 0;
    }
    
    • 请尝试用while循环打印下面的图形:
    1
    2 2
    3 3 3
    4 4 4 4
    5 5 5 5 5
    
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=1,b;
        while(a<=5){
            b=1;
            while(b<=a){
                printf("%d",a);
                b++;
            }
            printf("
    ");
            a++;
        }
        return 0;
    }
    
    • 请尝试用while循环打印下面的图形:
     1
     2 3
     4 5 6
     7 8 9 10
     11 12 13 14 15
    
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a=0,b,c;
        while(a<=5){
            b=0;
            while(b<=a){
                c++;
                b++;
                printf("%d ",c);//这里有空格
            }
            printf("
    ");
            a++;
        }
        return 0;
    }
    
    欢迎查阅
  • 相关阅读:
    DataGird导出EXCEL的几个方法
    csv文件与DataTable互相导入处理
    LeetCode 345
    LeetCode 168
    LeetCode 344
    LeetCode 342
    LeetCode 343
    LeetCode 326
    LeetCode 338
    LeetCode 319
  • 原文地址:https://www.cnblogs.com/gh110/p/12158219.html
Copyright © 2011-2022 走看看