【C】循环结构

循环结构

当需要重复执行一段代码很多次时,可以使用循环结构来解决问题

while语句

语法:

while (表达式)

循环体

只要表达式的值为真(非零),就会不断执行循环体里的内容。

实例1

  • 计算1+2+3+...+100的结果

int main()
{
   int i=1, sum=0;
    
    while (i<=100)
    {
        sum = sum + 1;
        i = i + 1;
    }
    printf("结果是:%d\n",sum);
    return 0;
}

运行结果

结果是:5050

实例2

int main()
{
    int count = 0;
    printf("请输入一行英文字符:");
    while (getchar() != '\n') //若接收到的字符不是
    {
        count = count + 1;
    }
    printf("你总共输入了%d个字符!\n",count);
    return
}
请输入一行英文字符:Hello World!
你总共输入了12个字符!

do...while语句

语法:

do

循环体

while (表达式);

while语句是先判断表达式值是否为真,如果为真再执行循环体里的内容;而do...while语句相反,它是先执行循环体的内容,再判断表达式的值是否为真,是再执行下一次循环。

while与do...while的比较

分析while与do...while之间的不同

  • while

    while语句条件判断的位置在循环的入口处,所以while语句是入口条件循环

    while (i <= 100)
    {
        sum = sum + 1;
        i = i + 1;
    }
    
  • do...while

    do...while语句条件判断的位置在循环的出口处,所以do...while语句是出口条件循环

    do
    {
        sum = sum + 1;
        i = i + 1;
    }while (i <= 100); //do...while语句,while之后有分号
    

    由于do...while是出口条件循环,所以它的循环体至少都会被执行一次

循环的基本结构

int count = 0; //初始化计数器
while (count < 10) //循环条件的判断
{
    printf("Hello!\n");
    count = count + 1; //更新计数器
}

for语句

语法:

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

循环体

三个表达式用分号隔开,其中:

  • 表达式1循环初始化表达式
  • 表达式2循环判断表达式
  • 表达式3循环调整表达式
int main()
{
    int count;
    for (count = 0; count < 3; count++)
    {
        printf("Hello!\n");
    }
    return 0;
}

运行结果

Hello!
Hello!
Hello!

练习

  • 写一个程序:判断一个数是否为素数。

    • 素数指在大于1的自然数中,除了1和此数自身外,无法被其他自然数整除的数。
    • 关于素数的求法有很多,这里用比较朴素暴力的方式:迭代测试从2到num/2所有整数是否能被整除(num为待测试的整数),如果没有出现能被整除的整数,那么它就是素数。
    int main()
    {
        int i, num;
        _Bool flag = 1;
        printf("请输入一个整数:");
        scanf("%d",&num);
        for (i = 2; i <= num/2; i++)
        {
            if (num % i == 0)
            {
                flag = 0;
            }
        }
        if (flag) //flag=1则执行
        {
            printf("%d是一个素数!\n", num);
        }
        else
        {
            printf("%d不是一个素数!\n", num);
        }
        return 0;
    }
    

灵活的for语句

  • 表达式1,表达式2和表达式3可以按照需要进行省略(但分号不能省:

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

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

    • for (表达式1; ; )

    • for ( ; ; ) // 死循环

    • ...

      int count = 0;
      for (count; count < 3;)
      {
      	printf("Hello!\n");
          count++;
      }
      
  • 表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式(即用逗号分隔多个表达式)

    int i, j;
    for ( i=0, j=10; i < j; i++, j--)
    {
        printf("%d\n", i);
    }
    return 0;
    

    运行结果

    0
    1
    2
    3
    4    
    
  • C99允许在for语句的表达式1中定义变量,但在表达式1中定义的变量只能在循环中使用,出了循环就无法使用:

    • for (int i =0 ; i < 100; i++)
    for (int i=0, j=10; i < j; i++, j--) 
    {
        printf("%d\n",i);
    }
    

    运行结果

    0
    1
    2
    3
    4
    

循环嵌套

  • 与分支结构一样,循环结构也能实现嵌套。分支结构决定了哪些语句会被执行,而循环结构决定了哪些语句会被执行多少次。

  • 对于嵌套的循环结构,它的执行顺序是由内到外,先执行内层循环,再执行外层循环

    int i, j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            printf("i = %d, j = %d\n",i,j);
        }
    }
    

    运行结果:

    i = 0, j = 0
    i = 0, j = 1
    i = 0, j = 2
    i = 1, j = 0
    i = 1, j = 1
    i = 1, j = 2
    i = 2, j = 0
    i = 2, j = 1
    i = 2, j = 2
    

练习

  • 打印九九乘法表:

    int i, j;
    for (i = 1;i<=9;i++)
    {
        for (j = 1; j <= i;j++)
        {
            printf("%d * %d = %-2d",i , j, i * j);
            //%-2d表示将数字按宽度为2,采用左对齐方式输出,若数据位数不到2位,则右边补空格
        }
        putchar('\n'); //putchar用于输出一个字符到标准输出流中。
    }
    

    运行结果:

    1 * 1 = 1   
    2 * 1 = 2   2 * 2 = 4
    3 * 1 = 3   3 * 2 = 6   3 * 3 = 9
    4 * 1 = 4   4 * 2 = 8   4 * 3 = 12  4 * 4 = 16
    5 * 1 = 5   5 * 2 = 10  5 * 3 = 15  5 * 4 = 20  5 * 5 = 25
    6 * 1 = 6   6 * 2 = 12  6 * 3 = 18  6 * 4 = 24  6 * 5 = 30  6 * 6 = 36
    7 * 1 = 7   7 * 2 = 14  7 * 3 = 21  7 * 4 = 28  7 * 5 = 35  7 * 6 = 42  7 * 7 = 49
    8 * 1 = 8   8 * 2 = 16  8 * 3 = 24  8 * 4 = 32  8 * 5 = 40  8 * 6 = 48  8 * 7 = 56  8 * 8 = 64  
    9 * 1 = 9   9 * 2 = 18  9 * 3 = 27  9 * 4 = 36  9 * 5 = 45  9 * 6 = 54  9 * 7 = 63  9 * 8 = 72  9 * 9 = 81 
    

break和continue——循环辅助语句

break语句

  • break语句可以用来让程序在中途跳出循环
int main()
{
	int i;
    for (i = 0; i < 10; i++)
    {
        if (i == 3)
        {
            break;
        }
    }
    printf("i = %d", i);
    return 0;
}

运行结果:

i = 3

在这个程序中,i++本来会循环10次,但通过break语句,程序循环到i等于3时就会跳出循环。

  • 对嵌套循环来说,break中负责跳出它所在那一层的循环。如果要跳出外层循环,需要再布置一个break语句

    int main(){
        int i, j;
        for (i = 0; i < 10; i++)
        {
            for (j = 0; j < 10; j++)
            {
                if (j == 3)
                {
                    break;
                }
            }
        }
        printf("i = %d, j = %d \n",i, j);
        return 0;
    }
    

    运行结果:

    i = 10, j = 3
    

    内层循环跳出了,外层循环还在继续执行。若需跳出整个循环,则需:

    int main(){
        int i, j;
        for (i = 0; i < 10; i++)
        {
            for (j = 0; j < 10; j++)
            {
                if (j == 3)
                {
                    break;
                }
            }
            if (j == 3)
            {
                break;
            }
        }
        printf("i = %d, j = %d \n",i, j);
        return 0;
    }
    

    运行结果:

    i = 0, j = 3 
    

continue语句

  • continue语句用于跳过本轮循环,执行下一轮循环

    int main(){
        int ch;
        printf("请输入一串英文:");
        while ((ch = getchar()) != '\n')
        {
            if (ch == 'H')
            {
                continue;
            }
            putchar(ch);
        }
        return 0;
    }
    

    运行结果:

    请输入一串英文:Hello world
    ello world
    

    H被跳过了,其他原文输出

拓展

goto语句

goto语句作用为:直接跳转到指定的标签位置

语法: goto 标签 (标签要定位于某个语句前边)

int main()
{
    int i = 5;
    while (i++)  //死循环
    {
        if (i > 10)
        {
            goto Label;
        }
    }
    
Label: printf("Here, i = %d\n",i); //定义标签
    return 0;
}

运行结果

Here, i = 11

注意:在程序开发中,要尽量避免使用goto语句。因为随意使用goto语句在代码里跳来跳去,会破坏代码原有的逻辑

posted @   芝麻凛  阅读(0)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示