0、引入
如果想要输出 5 行 *
printf("* ");
printf(" ");
printf(" ");
printf(" ");
printf(" ");
简单
输出 1w 行 *
ctrl CV 1w 次,不难但麻烦;没必要这样做,实际只是在重复的做一个事情
通过某种方式告诉计算机,让计算机来做 "重复的事情",就不用 傻傻的 CV
—> 循环结构
循环的本质: 重复
当需要重复执行某些相同/相似的的语句时,考虑使用 循环结构
C 语言中循环语句有三种:
while
do-while
for
goto 不是循环语句,但是能达到循环效果!!!
1、goto 语句
语法:
标志:
需要重复执行的语句块;
goto 标志;
goto 标志 无条件跳转到 标志的位置 往下继续执行
标志 需要符合 C语言 用户标识符的定义,建议使用大写;一般顶格写
eg:
语句块1;
FLAG:
printf("* ");
goto FLAG;
语句块2;
上面这种写法,会一直跳转,也就是一直重复执行 printf(" ");
导致不能执行到 语句块2,导致不会结束(死循环,非要程序结束 ctrl+c)
为了 不死循环,goto 语句一般与 if 语句联用
语句块1;
FLAG:
需要重复执行的语句块;
if(操作数)
goto FLAG;
语句块2;
如果 操作数的值非0,就执行 goto 语句;否则跳过 goto 语句
eg:
int count = 0;
FLAG:
printf(" ");
count++;
if(count < 10)
{
goto FLAG;
}
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test1.c
练习:
使用 goto 语句 实现输出 1 + 2 + 3 + … + 100 的和
tips:
sum = sum + 1;
sum = sum + 2;
…
sum = sum + 100;
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test2.c
2、while 语句
语法:
while(操作数) // 操作数 可以是 常量/变量/表达式
{
需要重复执行的语句块; // 循环体
}
当 操作数 的值非0,就会执行 需要重复执行的语句块; 执行完之后,再次判断 操作数的值情况
如果非0,就会执行 需要重复执行的语句块;执行完之后,再次判断 操作数的值情况
……
直到 操作数 的为0 / 任何位置遇到 break 也会结束当前的 while 语句
※※※※建议:
while 后面的语句块(循环体),用 {} 括起来;默认 只负责一个语句
几种常见情况:
①
while(操作数); // 没有错, while 循环体是 空语句; 循环体可能一直执行空语句
{
语句块;
}
②
while(操作数)
语句1; // 这条语句 是 循环体
语句2; // 不是循环体
③
while(-1) // 没有问题,没有 break,死循环
{
语句块;
}
eg:
while 求 1 + 2 + 3 + … + 100 的和
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test3.c
※※※※※※※※ 注意临界值的判断
练习:
使用 while 语句,输入一个正整数(< 21),求它的阶乘(unsigned long)
4! = 1*2*3*4 = 24
……
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test4.c
3、do-while 语句
语法:
do
{
循环体语句;
}while(操作数); // 分号一定要
// 操作数 可以是 常量/变量/表达式
无条件执行 循环体 一次; 执行完之后,再判断 操作数的值情况
如果非0,就会执行 循环体;执行完之后,再次判断 操作数的值情况
……
直到 操作数 的为0 / 任何位置遇到 break 也会结束当前的 do-while 语句
do-while 后面的语句块(循环体),用 {} 括起来;默认 只负责一个语句
※※※※while 和 do-while 的区别:
do-while 会无条件执行一次循环体再判断
while 先判断,再执行循环体
也就是说 do-while 至少执行一次循环体,while 至少一次都不执行
eg:
do-while 求 1 + 2 + 3 + … + 100 的和
int sum = 0,i = 1; // 初始化,从 1 开始计数,从 0 开始累和
do
{
sum += i; // 之前数的总和 += 当前数
i++; // 后一个数 = 当前数 + 1
}while(i <= 100);
printf("1+2+…+100 = %d ",sum);
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test5.c
练习:
1、使用 do-while 求 0~1000 内所有奇数之和
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test6.c
2、输入两个正整数 x,y;求这两个正整数的最小公倍数(while / do-while)
eg:
4: 4 8 12 16 20 ….
6: 6 12 18 24 ….
4 和 6 的最小公倍数为 12
两个正整数的最小公倍数范围 max(x,y) ~ x*y
tips:
穷举法
把所有可能的为最小公倍数的数一一进行判断
num % x == 0 && num % y == 0 num 是 x 和 y 的公倍数
max(x,y) ~ x*y 范围中第一个满足的就是最小公倍数
判断 6 是否是 4 和 6 的公倍数,满足就找到了;如果不是
判断 7 是否是 4 和 6 的公倍数,满足就找到了;如果不是
判断 8 是否是 4 和 6 的公倍数,满足就找到了;如果不是
……
判断 24 是否是 4 和 6 的公倍数,满足就找到了
过程中只要找了就可以使用 break 结束
优化穷举法
把较大数的倍数,依次判断是不是 较小数的倍数,如果是就找到了
判断 6 是否是 4 和 6 的公倍数,满足就找到了;如果不是
判断 12 是否是 4 和 6 的公倍数,满足就找到了;如果不是
……
判断 24 是否是 4 和 6 的公倍数,满足就找到了;如果不是
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test7.c
4、for 语句
语法:
for(操作数1;操作数2;操作数3) // 必须两个分号,不能少
{
循环体语句;
}
※※※※※※说明:
①操作数可以是 常量/变量/表达式
②操作数1(表达式1) 一般称之为 "初始条件",最先执行的且只会执行一次
可以是变量的定义 / 初始化(eg: int a / int a = 2333)
③操作数2(表达式2) 一般称之为 "判断条件",决定是否执行 循环体语句
操作数2值非0就执行 循环体语句;否则不执行,结束 for 语句
④操作数3(表达式3) 一般称之为 "改变条件",用来改变某些值,使 判断条件 趋向于不成立
⑤这三个操作数(表达式),可以省略 任意一个/两个/三个,分号一定不能省略
省略 操作数2(表达式2),表示 "判断条件" 值非0 (需要使用 break,才能结束 for 语句)
先执行 操作数1(表达式1) 有且一次,然后 判断 "判断条件" 的值是否非 0
如果 其值非 0,就执行 循环体语句,再执行 "改变条件"
再判断 "判断条件" 的值是否非 0,如果 其值非 0,就执行 循环体语句,再执行 "改变条件"
…..
直到 "判断条件" 的值为 0 / 任何位置遇到 break 也会结束当前的 for 语句
for 后面的语句块(循环体),用 {} 括起来;默认 只负责一个语句
eg:
使用 for 求 1~1000 的偶数
int sum = 0,i = 1; // 初始化,从 1 开始计数,从 0 开始累和
for(i = 0;i <= 1000;i = i+2)
{
sum += i; // 之前数的总和 += 当前奇数
}
printf("2+4+…+1000 = %d ",sum);
参考示例代码 CS2415/一阶段/1C语言/07.05_循环结构/demo/test8.c
练习:
自行测试 省略任意两个 操作数 和 省略 三个 的情况
使用 for 语句完成之前的一些练习
分析:
int sum = 0; int sum = 0; int sum = 0;
int i = 1; int i = 1; int i = 1;
while(i <= 100) do for(;i <= 100;)
{ { {
sum += i; sum += i; sum += i;
i++; i++; i++;
} }while(i <= 100); }
三种循环语句可以转换使用,具体个人而定
5、循环嵌套
循环语句中循环体中又有循环语句
经典使用方式:
int i,j;
int count = 0;
for(i = 0;i < 5;i++) // 外循环
{
for(j = 0;j < 5;j++) // 内循环
{
count++;
}
}
printf("count = %d ",count); // 25
一般来说 循环次数 = 外循环次数 * 内循环次数
int m = 0,n;
int num = 0;
while(m <= 5) // 外循环
{
for(n = 0;n < m;n++) // 内循环
{
num++;
}
m++;
}
printf("num = %d ",num); // 15
循环嵌套,注意 内外循环的 关系
6、continue 和 break
continue 只能用在 循环语句中
用于跳出本次循环(continue 之后的语句不会再执行,重新开始下一次 循环体的执行),继续下一次循环
break 可以用于 switch 语句中,跳出当前的 switch 语句
break 也可以用于 循环语句中,跳出当前的 循环 语句
eg:
int i,count1 = 0;
for(i = 0;i < 5;i++)
{
count1++;
if(count1 == 3)
{
break;
}
printf("count1 = %d ",count1); // 2次 1 2
}
printf("count1 = %d ",count1); // 1次 3
count2 = 0;
for(i = 0;i < 5;i++) // 外循环
{
count2++;
if(count2 == 3)
{
continue;
}
printf("count2 = %d ",count2); // 4次 1 2 4 5
}
printf("count2 = %d ",count2); // 1次 5
for(i = 0;i < 5;)

continue; // 导致死循环
i++;
printf("i = %d ",i);
总结:
默认负责一个语句
普通的一条语句
复合语句 诸如 if switch while …..
循环语句相互之间的转换
注意临界值
相关语句使用的注意
作业:
1、使用 循环 语句,把所有的 "水仙花数" 输出
"水仙花数"
是一个三位数,且 个位、十位、百位上的数字立方和等于本身
eg:
123 –> 1*1*1 + 2*2*2 + 3*3*3 = 36 != 123
123 不是水仙花数
百位 三位数 / 100
十位 三位数 / 10%10
个位 三位数 %10
2、输出 九九乘法表
嵌套循环
1*1=1
1*2=2 2*2=4
……
1*9=9 2*9=18 …… 9*9=81
3、输入两个正整数 x , y,求 x,y 的最大公因数
eg:
4: 4 2 1
6: 6 3 2 1
4,6 的最大公因数是 2
最大公因数的范围:
[1,min(x,y)]
①穷举法
从 min(x,y) 开始一直到 1
只要其中某个数满足 (x % i == 0 && y & i == 0) over,不需要继续做
②辗转相除法
18
30
两个数,大数取余小数, 小数取余余数 …. 直到余数为0 上一次的余数就是 最大公因数
30 % 18 = 12
18 % 12 = 6
12 % 6 = 0 —-> 6 就是最大公因数
4、求 Sn = a + aa + aaa + aaaa + …. + a…a(n个a)
a(1~9) 和 n 由键盘输入
eg:
a 3
n 3
Sn = 3 + 33 + 333 = 369
a 2
n 4
Sn = 2 + 22 + 222 + 2222 = 2468
sum += 当前数
当前数 = 上一个数 * 10 + a
An = An-1 * 10 + a
Sn = Sn-1 + An
5、特殊的完全平方数
输出 [100,999] 中符合要求的数字
这个数既是 完全平方数(4 = 2*2,9 = 3*3….),该三位数的任意两位数字相同
eg:
100 = 10 * 10 完全平方数
百位 1 十位 0 个位 0 个位与十位数字一样
100 是一个特殊的完全平方数
121 = 11 * 11 完全平方数
百位 1 十位 2 个位 1 个位与百位数字一样
121 是一个特殊的完全平方数
tips:
穷举法 n = i * i
不要穷举 n , 而是穷举 n 的平方根 i
i [10,32)
附加题:
6、输出1000 内所有的完数
完数指的是除了本身之外,所有因数和 等于本身
eg:
6 :
1 + 2 + 3 == 6
% == 0 就是因数 下个数在判断
1~n-1
6 是完数
7:
1 != 7
7 不是完数
每个数求和都要重新归 0
7、连续个正整数之和,一个正整数可以被表示为 n(n >= 2) 个连续正整数之和
eg:
6 = 1 + 2 + 3
15 = 1 + 2 + 3 + 4 + 5
15 = 4 + 5 + 6
15 = 7 + 8
写个程序,对输入的一个正整数,输出它所有可能的连续正整数之和。
(有可能没有,没有就不输出有可能有多个)
提示: 输入的数是 n
假设从 1 开始
依次加判断是否相等
如果累加和 大于 n,结束,表示没有从 1 开始的
假设从 2 开始
依次加判断是否相等
如果累加和 大于 n,结束,表示没有从 1 开始的
……
假设从 n/2 开始
依次加判断是否相等
如果累加和 大于 n,结束,表示没有从 n/2 开始的
n/2 + 1 不用考虑
起始的数和结尾的数
知道后,一个一个输出就好了
8、将一个正整数分解质因数
eg:
16 = 2 * 2 * 2 * 2
90 = 2 * 3 * 3 * 5
从 2 开始判断能否除尽
能输出 2 ,再 / 2 ,直到不能除以 2 为止
从 3 开始判断能否除尽
能输出 3 ,再 / 3 ,直到不能除以 3 为止
….
直到这个数 变为 1

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/176606.html