当前位置: 首页 > news >正文

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

循环语句

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来跳脱整个循环。

http://www.dtcms.com/a/279914.html

相关文章:

  • TypeScript枚举类型应用:前后端状态码映射的最简方案
  • 深入学习前端 Proxy 和 Reflect:现代 JavaScript 元编程核心
  • Java并发编程之线程池详解
  • openGL学习(Shader)
  • 【面板数据】全国地级市逐日空气质量指数AQI数据集(2013-2024年)
  • 代码随想录算法训练营第四十九天|单调栈part2
  • Java强化:IO流
  • 正则表达式替换中使用 g<0> 引用整个匹配的内容
  • vim扩展与 neovim
  • IOS开发者账号如何添加 uuid 原创
  • Doris
  • 20250714--长连接应用中ORA-04061: existing state of has been invalidated
  • 迪拜金融市场交易量激增,中阿资本合作深化——阿联酋交易所系统解决方案全景解析
  • Transformer江湖录 第七章:江湖新篇 - Transformer的现代演化
  • FilterRegistationBean报错does not have type parameters。idea启动日志无明显报错提示冲突 kaki的博客
  • 力扣-25.K个一组翻转链表
  • 多线程进阶——线程安全的集合类
  • B站自动回复工具(破解)
  • Linux多进程
  • 国产IP摄像头存在隐蔽后门,攻击者可获取Root权限
  • 知识点2:MCP:python-sdk 核心概念
  • 丑团-h5-Mtgsig算法-分析
  • 技能升级--二分例题
  • 2025年大数据、建模与智能计算国际会议(ICBDMIC 2025)
  • 指针和数组(二)
  • AI 临床医学课题【总结】
  • Vue2 day08-10(智慧商城)
  • 应用系统报错:com.highgo.jdbc.util.PSQLException:bad value for long(APP)
  • DOM事件绑定时机:解决脚本提前加载导致的绑定失败
  • git modules