C语言基础5——控制语句2(循环)

发布于:2025-07-16 ⋅ 阅读:(18) ⋅ 点赞:(0)

循环语句

1 for循环

1.1 基本结构

for(表达式1;表达式2;表达式3)

{

        语句块;

}

表达式1: 赋初值
表达式2: 循环的判断条件(满足条件则进入循环语句块,不满足则跳出循环)
表达式3: 增值或减值(循环条件的变换)

执行顺序: 首先执行表达式1赋值,然后执行表达式2进行判断,如果判断结果为真则进入循环执行语句块,再执行表达式3增值或减值语句,然后继续执行表达式2进行判断是否成立,直到表达式2不成立则退出循环。

【例】求5!

#include <stdio.h>

int main()
{
    int s = 1 ;
    for (int i = 1 ; i <= 5 ; i ++)
    {
        s *= i ;//s = s * i;
    }
    printf("%d\n", s);
    
    return 0;
}

与累加同理,以上例子是用for循环进行对一个数的累成。

1.2 嵌套结构

for(表达式1;表达式2;表达式3)

{

        for(表达式4;表达式5;表达式6)

        {

                语句块

        }

}

练习1:用for循环打印99乘法表(参考答案见文章最后)

i=1: 1*1=1

i=2: 1*2=2 2*2=4

i=3: 1*3=3 2*3=6 3*3=9

i=4: 1*4=4 2*4=8 3*4=12 4*4=16

1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64

1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

1.3 变形

(1)变形一:

表达式1;

for(;表达式2;表达式3)

{

        语句块;

}

(2)变形二:

表达式1;

for(;表达式2;)

{

        语句块;

        表达式3;

}

(3)变形三

for(;;) //死循环

{

语句块;

}

*以上三种变换分别改变了三个表达式的位置,表达式1和表达式2可以分别放在循环语句外和循环语句内。如果不写表达式2,对应的整个for循环没有终止条件,此时便成为了一个死循环。
在编程的时候有时会借用死循环来完成一些操作,但在C语言中一般借助while实现死循环。

练习2:打印所有的水仙花数(答案见本文章最后)

水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数

【练习前例】打印以下图案:

要求行数从终端输入。

输入:5

输出以下:

#include<stdio.h>

int main()
{
    int a ;
    scanf("%d", &a);
    for(int  i = 1 ; i <= a ; i ++)
    {
        for(int j = 1 ; j <= i ; j ++)
            printf("*");
        putchar(10);
    }
    
    return 0 ;
}

练习3:要求行数从终端输入。(答案见本文最后)

输入:5

输出以下:

解题思路:  

      用for循环嵌套实现外层循环控制行数,内层循环控制每行个数。

2 while循环

定义循环变量并赋值;

while(判断条件)

{

        语句块;

        增值或减值语句;

}

执行顺序:首先定义循环变量并赋值,然后判断条件是否成立,如果成立则进入循环执行语句块以及增值或减值语句,然后继续判断,直到判断不成立则退出循环。

类似于for的变形。

【例】 1到100累加求和

##include<stdio.h>
int main()
{
    int sum = 0 ;
    int i = 1;
    while(i <= 100)
    {
        sum += i ;//sum = sum +i ;
        i ++ ;
    }
    printf("%d\n", sum) ;

    return 0 ;
}

练习题:

练习4:有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( )(答案见本文最后)

A. 一次也不执行                   B. 执行1次

C.有语法错,不能执行         D. 无限次

练习5:下列程序的输出结果是( )(答案见本文最后)

int main(void)

{

        int Y = 100;

        while(Y--);

        printf("Y=%d", Y);

}

A. Y = 0         B. Y = 1         C. Y = -1         D. Y = 随机数

3 do_while语句

定义循环变量并赋值;

do

{

        语句块;

        增值或减值语句;

}while(表达式);//只有do—while循环后面有分号

注意:do_while循环必须要先执行依次do后面的语句块且至少执行依次,而while循环只要条件不满足内部循环语句块可能一次都不执行。

练习6:实现1-100的和(答案见本文最后)

4 死循环

死循环(Infinite Loop)是指程序在运行过程中,因逻辑错误或设计缺陷,导致某个循环结构永远无法满足退出条件,从而无限重复执行,程序无法继续向下运行或正常终止。

以下三种方式都可以实现死循环

1——for(;;){}

2——while(1){}                        

// 让程序卡死在这等

3——while(1);

5 循环控制语句

break:直接结束循环
continue:结束本次循环,继续下次循环

使用场景:
使用在循环语句中,结束循环
使用时需要有判断条件

【例】(可自行分析以下break和continue在本程序中的作用)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    for(int i = 1; i <= 5; i++)
    {
        if(i == 3)
            // break;
            continue;
        printf("%d\n", i);
    }
    return 0;
}

练习7:从终端上输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。(答案案见本文最后)

------------------------------------------------------这是一条分割线------------------------------------------------------

天才预设的上一篇跳转路径:

天才预设的下一篇跳转路径:未完待续~~~

练习答案

练习1:

用for循环打印99乘法表(参考答案见文章最后)

i=1: 1*1=1

i=2: 1*2=2 2*2=4

i=3: 1*3=3 2*3=6 3*3=9

i=4: 1*4=4 2*4=8 3*4=12 4*4=16

1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64

1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int i, j;
    for (i = 1; i <= 9; i++)
    {
        for (j = 1; j <= i; j++)
            printf("%d*%d=%d    ", j, i, i * j);
        printf("\n");
    }
    return 0;
}

打印一个九行九列的乘法表,初步认为内外层循环次数都为9,(注意for循环并不一定必须从0开始)for循环从1开始循环到9,对应的九九乘法表中每一个式子的元素,而九九乘法表是一个斜三角,于是分析内层循环要以外层循环的i值为结束值,然后在最内部执行打印语句。(注意可以用之前学到的格式化输出(m.n)或直接打印空格来调整间距)

练习2:

打印所有的水仙花数(答案见本文章最后)

水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数

#include<stdio.h>

int main()
{
    int g , s , b , i ;
    for(int i = 100  ; i <= 999 ; i ++)
    {
        g = i % 10 ;
        s = i / 10 % 10 ;
        b = i / 100 ;
        if(b * b * b + s * s * s + g * g * g == i)
            printf("%d\n", i)
    }

    return 0 ;
}

本练习比较简单,分别定义三个变量存取循环数的个位十位百位,然后用一个if判断语句来判断是否为水仙花数

 练习3:

要求行数从终端输入。(答案见本文最后)

输入:5

输出以下:

解题思路:  

      用for循环嵌套实现外层循环控制行数,内层循环控制每行个数。

图案下面倒着的部分的规律:n=5

通过本图找到空格数与星星数的关系,然后确定循环的结束条件。

行数i

空格数=i-1

星星数=n+1-i

1

0=1-1

5=5-1+1

2

1=2-1

4=5-2+1

3

2=3-1

3=5-3+1

4

3=4-1

2=5-4+1

5

4=5-1

1=5-5+1

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a;
    scanf("%d", &a);
    for (int i = 1; i <= a; i++)
    {
        for (int j = 1; j <= i; j++)
            printf("*");
        printf("\n");
    }

    for (int i = 1; i <= a; i++) //外层循环每一行
    {
        //循环打印空格
        for (int j = 1; j < i; j++)
            printf(" ");
        //循环打印星星
        for (int k = 1; k <= a + 1 - i; k++)
            printf("*");
        //打印换行
        printf("\n");
    }

    return 0;
}

练习4:

有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( )

A. 一次也不执行                   B. 执行1次

C.有语法错,不能执行         D. 无限次

注意:while内部并不是判断==,而是赋值=,实际上是对k进行一个赋值,且每次经理循环k值都会被改为1 

练习5:

下列程序的输出结果是( )(答案见本文最后)

#include<stdio.h>

int main(void)
{
    int Y = 100;
    while(Y--);
    printf("Y=%d", Y);
}

A. Y = 0         B. Y = 1         C. Y = -1         D. Y = 随机数

此循环要执行100此,while内部的判断语句非0则真,直到Y == 0的时候循环截至,但是因为Y--的缘故Y依旧要执行自减,最后值为-1

练习6:

实现1-100的和(答案见本文最后)

#include<stdio.h>

int main()
{
    int i = 1 , sum = 0 ;
    do
    {
        sum += i ;
        i++ ;
    }while(i <= 100);
    
    return 0;
}

定义循环变量i求和变量sum,跟while循环逻辑相同,将i的值累加到sum上,区别就是在第一次判断循环条件之前先执行了一次累加

练习7:

从终端上输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。(答案案见本文最后)

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char ch;
    while (1)
    {
        scanf(" %c", &ch);
        if(ch == 'q')
            break;
        printf("%c\n", ch);
    }
    return 0;
}

if语句判断输入的字符ch是否为q,若为q怎进入循环执行break,跳出整个循环,否则继续执行,因为本循环while内的条件是1,是一个死循环,所以只能通过break来跳脱整个循环。


网站公告

今日签到

点亮在社区的每一天
去签到