03、C语言的循环结构
①基本的循环语句
1.1 while循环
while循环的基本模式:
while(表达式) //当循环条件被满足,继续向下执行
{
循环体; //若条件成立,则一直循环
//若想跳出循环,则需要改变循环条件,使条件不成立
}
来个例子①
#include<stdio.h>
int main()
{
int count=0;//来个计数器
while(count<3)
{
printf("I_LOVE_CODING\n");
count++;//改变循环条件的计数器
}
return 0;
}
1.2 do while循环
do while循环的基本模式:
do
{
循环体;
}while(表达式);
举个例子:
int count=0;
do
{
printf("ILOVEYOU\n");
}while(count<3);//满足条件三次,所以打印三遍
此循环与while循环稍有不同之处在于:无论条件成立与否,循环至少执行一次
do
{
}while(0); //此循环就只执行一次,多用于宏里
1.3 for循环
for循环基本样式:
for(表达式1;表达式2;表达式3)
{
循环体4;
}
表达式1:循环条件的初始化
表达式2:条件或逻辑表达式作为限制循环的条件
表达式3:改变循环的语句
循环的过程:1 {2 4 3} {2 4 3} {2 4 3}
再来个小栗子:
for(int count=0;count<3;count++)
{
printf("CSDN\n");
}
//表达式1也可出来
int count=0;
for(;count<3;count++)
{
printf("CSDN\n");
}
基本的循环语句看完了,了解下变异版循环——死循环,顾名思义,死循环就是走不出去的循环,即条件一直被满足
while的死循环在第二课的博客中用到过
while(1)
{
printf("爱你一万年\n");
}
do while 循环类似
do
{
printf("PPP\n");
}while(1);
for循环就很变态了
for(;1;);
for(;;);
感受一下被死循环支配的恐惧,for(;1;)亦是如此;
②作用域和生命周期
作用域:从变量产生的位置到最接近变量的大括号内
变量分为
全局变量:不被大括号包含的变量
局部变量:被大括号包含的变量
Talk is cheap , show you the code
#include<stdio.h>
int iNum=0; //此为全局变量
int main()
{
int iNum=0;//此为局部变量,即使重名也没毛病,因为并不在同一作用域内
return 0;
}
在同一作用域下,变量不可重名;
不同作用域下同名问题的解决:就近原则;
静态变量:static 修饰的变量,定义时必须初始化,且每次执行保留上一次执行后的结果
for(int count=0;count<3;count++)
{
int i_Count=0;
static int s_Count=0;
i_Count++;
s_Count++;
printf("i_Count=%d\n",i_Count);
printf("s_Count=%d\n",s_Count);
}
上图片:简单明了(手动狗头)
③循环的基本使用
如何使用循环?
1、描述有规律的事
1.1 次数问题
1.2 名次问题
int count = 0;
while (count++ < 3)
{
printf("第%d名\n", count);
} //打印出来是 第1名(换行)第2名(换行)第3名(换行)
count = 0;
while(++count<3)
{
printf("第%d名\n", count);
} //打印出来是 第1名(换行)第2名(换行)
2、做递推使用
2.1 求和问题
//从1加到100
int result = 0;
for (int i = 1; i <= 100; i++)
{
result += i;
}
printf("result=%d\n", result);
2.2 公式求解问题
比如辗转相除法:
//最大公约数,正常人的写法
int m = 0, n = 0;
scanf("%d%d", &m, &n);
int max = m > n ? m : n;
int min = n < m ? n : m;
for (int k = min; k > 0; k--)
{
if (max % k == 0 && min % k == 0)
{
printf("%d\n", k);
break;
}
}
//辗转相除法
result = max;
while (result != 0)
{
result = max % min;
max = min;
min = result;
}
printf("%d\n", max);
2.3 拆分整数
int iNum = 1234;
while (iNum)
{
printf("%d\n", iNum % 10);
iNum /= 10;
}
printf("\n");
④、循环嵌套
用于描述1、行列关系
int i , j ;
for (i = 0; i<3; i ++) //外层循环
{
for (j = 0; j<3; j ++) //内层循环
{
printf("%d%d\t", i, j);
}
printf("\n");
}
2、行与数目关系
/*
*
***
*****
*******
*/
for (int i = 0; i < 4; i++)
{
for (int k = 1; k < 4- i; k++)
{
printf(" ");
}
for (int j = 0; j <2*i+1; j++)
{
printf("*");
}
printf("\n");
}
3、枚举出来筛选数据
标记法
上才艺
//求素数:只能被自身和1整除的数字就是素数
//整除:取余等于0
//标记法
int num = 123;
int flag = 0;
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
flag = 1;
}
}
if (flag == 1)
{
printf("不是素数\n");
}
//分析标记讨论结果
else
{
printf("素数\n");
}
⑤跳出语句
break: 跳出switch语句,跳出一次循环
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==2&&j==2)
{
break;
}
}
printf("在此处跳出!\n");//break 跳出一次循环
}
goto: 跳转到标识位置
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==2&&j==2)
{
goto NEXT;
}
}
}
NEXT: //跳到标识处
;
continue: 跳出(结束本次执行,继续下一次循环)
for(int i=0;i<10;i++)
{
if(i%3==0)
{
continue;//当满足if语句条件时,无视本次满足if条件的打印任务,直接继续
}
printf("热爱工作\n");
}
i=3,6,9时跳过打印任务,因此只打印6次
⑥随机函数
1、rand():产生一个随机unsigned int数字
2、如何控制范围:取余
X % N —— [0,N-1]
rand() % X —— [0,X-1]
rand() % X + a —— [0,X-1+a]
rand() % X * 10 —— 随机产生的数字都能被10整除
3、设置随机函数种子:
设置随机函数范围:
srand(200);//范围是0—200
srand((unsigned int)time(0));//随机数根据时间而改变