C语言基础:
循环的构成:
-
循环体
-
循环条件
循环的分类:
-
无限循环:程序设计中尽量避免无限循环。(程序中的无限循环必须可控)
-
有限循环:循环限定循环次数或者循环的条件。
当型循环的实现:
while
语法
while(循环条件)
{
循环语句
}
说明:
1.循环条件的返回值必须为布尔类型,在C语言中,布尔类型为真使用非0表示,布尔类型为假使用0表示。
2.{}包起来的内容为循环体。
3.我们要在循环体中控制循环条件的变化,否则会产生死循环。
执行过程:
特点:
先判断,后执行,循环体语句有可能一次也不执行。
案例1:
/*
需求:while循环案例
*/
#include <stdio.h>
int main()
{
//定义一个变量,保存累加和
int sum = 0;
//定义一个循环变量
int i = 1;
while(i <= 100)//循环条件,可以有关系表达式、逻辑表达式,表达式运算结果是boolean(1;0)类型
{ //计算
sum += i;
//给循环变量赋值,用来影响循环条件
i++;
}
printf("1-->100的累加和是:%d\n",sum);
return 0;
}
案例2:
//while计算1~100之间的偶数和
#include <stdio.h>
int main()
{ //创建变量,存放累加和
int sum = 0;
//创建循环变量
int i = 2;
while(i <= 100)
{
//排除奇数
if(i % 2 == 0)//表示被2整除,说明为偶数
{
sum += i;
}
i++;//改变循环变量的值
}
printf("1~100偶数的累加和是:%d",sum);
return 0;
}
死循环
while(1) // 我们会在死循环进行必要的限制
for
语法:
for(表达式1;表达式2;表达式3)
{
循环语句;
}
说明:
-
() 中可以只保留两个分号 😉
-
① 是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分隔,举例: int i=0,j=0
-
② 是循环条件,用来限制循环的次数,循环条件支持关系表达式,如果加入逻辑表达式,会变成
复合表达式,举例: i < 10 && j < 10
- ③ 改变循环条件,支持列表,这里可以使用赋值表达式,举例: i++,j++
- 执行顺序:①②④③ --> ②④③ --> ②④③ … --> ②,这里①只执行1次。
执行过程:
特点:
先判断,后执行,循环体语句有可能一次都不执行。
案例:
/**
* 需求:for循环案例-求1~100之间的偶数和
*/
#include <stdio.h>
// while实现
void while_test()
{
int sum = 0;
int i = 1;
while(i <= 100)
{
if(i % 2 == 0)
{
sum += i;
}
i++;
}
printf("while实现:1~100之间的偶数和:%d\n",sum);
}
// for实现
void for_test()
{
int sum = 0;
for(int i = 1;i <= 100;i++) // 死循环表示:while(1)、for(;;)
{
if(i % 2 == 0)
{
sum += i;
}
}
printf("for实现:1~100之间的偶数和:%d\n",sum);
}
int main()
{
while_test();
for_test();
return 0;
}
案例:
//需求:for案例用户可通过键盘录入一个整数n用来作为阶乘的最高位数
#include <stdio.h>
#include <math.h>
int main()
{
int n = 1;//接受控制台输入,作为阶乘最高位
int r = 1;//用来接收计算结果
printf("请输入一个整数:\n");
scanf("%d",&n);
//循环实现阶乘
for(int i = 1;i <= fabs(n);i++)
{
r *= i;
}
printf("1~%d之间的阶乘的结果是%d\n",n,r);
return 0;
}
总结
-
for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限循环的几率。
-
应用场合:for语句往往应用于循环次数事先可以确定的场景。
死循环:
for(表达式1;;表达式3);
for(;;);
循环实现的三要素:
-
循环变量初始化
-
循环条件
-
循环变量更新
案例:
/*
需求:for案例-求Fibonacci数列前20个数。
*/
#include <stdio.h>
int main()
{
int f1 = 1;// 前一个数,默认是1,因为第1个是1
int f2 = 1;// 后一个数,默认是1,因为第2个是1
int i = 1;// 循环变量
for(;i <= 20;i++)
{
printf("%12d%12d",f1,f2);
// 一行显示两个数,每两个换一行
if(i % 2 == 0)
{
printf("\n");
}
f1 = f1 + f2; // f1 = 2 = 1+1
f2 = f2 + f1; // f2 = 3 = 1+2
}
return 0;
}
直到型循环的实现:
do…while
语法:
do
{
循环体;
} while(循环条件);
说明:
- 循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用
非0
来表示,布尔类型为假使
用 0
表示。
- {} 包起来的内容整体称之为为
循环体
。 - 我们要在
循环体
中控制循环条件
的变化,否则会产生死循环。
执行过程;
特点:
先执行,后判断,循环体语句至少执行一次。
案例:
//do..while案例:求1~100之内的奇数累加和
#include <stdio.h>
int main()
{
//创建一个变量,用来存储累加和
int sum = 0;
//创建循环变量,默认值1
int i = 1;
do
{
//判断i是否是奇数
if(i % 2 != 0)
{
sum += i;
}
i++;//改变循环变量的值
}while(i <= 100);
printf("1~100之间的奇数的累加和是:%d\n",sum);
return 0;
}
循环的嵌套:
3种循环(while、do……while、for)可以互相嵌套。在前一个循环结构的内部又存在一个完整的循环
结构,如:
案例:
/**
* 需求:嵌套for循环案例-求100~200之间的所有素数
*/
#include <stdio.h>
int main()
{
int num = 100;// 存放100~200之间的自然数
int i = 2;// 循环变量,默认从2开始,因为自然数除以1没有意义 102,100~102, 102%100,102%101
int isPrime = 1;// 用来记录1~自身之间能整除的次数 6, 2~5, 6%2,6%3,6%4,6%5
// 第1层for循环:生成100~200之间的自然数
for(;num <= 200; num++)
{
// 默认是素数
isPrime = 1;
// 第2层循环,生成 2~自身-1的自然数,用于和自身校验,是否能够整除,如果有1个能被整除,就说明不是素数
for(i = 2; i < num -1; i++)
{
if(num % i == 0)
{
isPrime = 0;// 不是素数
}
}
if(isPrime) // 条件判断:isPrime == 1 缩写 isPrime
{
printf("%d ",num);
}
}
printf("\n");
return 0;
}
循环结构的典型应用场景
- 求累和:举例
1+2+3+4+..+100
的和 - 求累乘:举例
1* 2 * 3 * 4 *100
的积 - 求均值:举例
(1+3+4+5+..100)/100
- 求极值:举例:
12,34,55,2,66
中的最大值域或最小值 - 元素遍历:常用于数组元素的遍历,比如:从
【1,2,3,4,5】
获取每一个元素 - …
基础算法模型
1.累加和
- 定义一个变量(sum),并赋初值为0;
- 使用变量累加(+=)每一个数据项(i)
- 当访问每一个数据项,此时该变量的取值是累加和的结果。
2.累乘
- 定义一个变量,并赋初值1;
- 用该变量累乘(*=)每一个数据项;
- 当访问完一个数据项,此时该变量的取值就是累乘的结果。
3.极值【知识点:数组】
-
定义一个变量,并赋初值为第一个数据项。
-
从第二个数据项开始,一次性与该变量进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量。
-
当访问完每一个数据项,此时该变量的取值就是求极值的结果。
2,34,55,2,66`中的最大值域或最小值
- 元素遍历:常用于数组元素的遍历,比如:从
【1,2,3,4,5】
获取每一个元素 - …