c语言分支和循环总结,C语言之分支语句和循环语句总结.md

# C语言之分支与循环

## 一、分支语句

>* **if......else**

>

>* **switch**

### if语句

~~~text

语法结构:

1、if(表达式)

语句;

2、if(表达式)

语句1;

else

语句2;

3、if(表达式1)

语句1;

else if(表达式2)

语句2;

else

语句3;

~~~

说明:

>1. 表达式结果为真(非0),则语句执行,假(0)不执行表达式后面的语句而直接执行位于该**if**语句后的下一条语句

>2. 语句有多条时,需要用{ }括起来,使代码的逻辑更加清楚

>3. **else**总和位于它前面的最近的未配对的**if**配对,因此为了提高代码的可读性,不可将**else**悬空,作为一个想要成为大有出息的程序员的我们,要形成良好的代码风格

代码举例:

代码内容为输入成绩grade,区间为[0,100],如果成绩在[90,100]区间内输出优秀,在[80,90)区间内输出良好,在[60,80)区间内输出合格 ,低于60输出不合格。

~~~c

#include

int main()

{

int grade = 0;

printf("请输入0到100的分数成绩:");

scanf("%d",&grade);

if(grade >= 90 && grade <= 100)

//在逻辑语句中不能写成100>=grade>=90这样的形式,会引起错误

//例如输入95,100>=grade为真返回1,1小于90,为假返回0,不输出优秀,这违背了优秀的定义

printf("优秀\n");

else if(grade < 90 && grade >= 80)

printf("良好\n");

else if(grade <80 && grade >= 60)

printf("合格\n");

else

//低于60分的情形

printf("不合格\n");

return 0;

}

~~~

效果:

![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093518_a0bb6e41_8907017.png "分数if.png")

### switch语句

~~~text

语法结构:

switch(整形表达式)

{

case 整形常量表达式:

语句;

}

~~~

说明:

>1. 当分支语句过于多时,使用**if**...**else**语句的形式会过于冗余,这时**switch**语句就会派上用场了,该语句常常用于多分支的情况

>2. **switch**后面的( )中放的是整形表达式,包括整形、字符型、枚举数据型,所以( )中是浮点型的话就会出现错误,**case**后面的整形常量表达式要与之匹配

>3. **case**语句和整形常量表达式之间一定要有一个空格,并且**case**后面如果需要执行多条语句,是不需要用花括号括起来的

>

>4. **switch**语句中,需要搭档**break**使用才能实现真正的分支。其实际效果是吧语句划分为不同的部分,在每条**case**语句的后面都加上**break**是一个良好的编程习惯,可以避免在很久以后再添加一条**case**语句时前面没有**break**而产生错误的情况

>

>5. **default**子句,在**switch**语句中的所有**case**标签的值都无法匹配时,需要在语句列表中增加一条**default**子句,此时该子句后面的语句就会被执行,该子句可以出现在语句列表中的任何位置。每个**switch**语句都放一条**default**子句,并且在后面加一个**break**是一个编程好习惯

>6. **switch**语句的执行是按顺序的,当括号内的整形表达式的值和某**case**后整形常量表达式的值相等时,就执行其后面的语句,执行完后自动执行下一个**case**后面的语句,直到遇见**break**或者**switch**语句的右括号为止

代码举例:

实现一个星期的分支,使输入1-5时输出"工作日",输入6-7时输出"休息日",输入非1-7之间的数时输出"输入错误"

~~~c

#include

int main()

{

int day = 0;

scanf("%d",&day);

switch(day)

{

case 1:

case 2:

case 3:

case 4:

case 5:

printf("工作日\n");

break;

//前4条case语句没有语句,也没有加break,程序就会按顺序向下执行,

//直到遇见第五条case语句,输出了工作日并且执行break跳出分支语句

case 6:

case 7:

printf("休息日\n");

break;

default:

printf("输入错误\n");

//当输入非1-7之间的数时就会执行default子句

}

return 0;

}

~~~

效果:

![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093543_aac586ed_8907017.png "switch星期输出.png")

## 二、循环语句

>* **while**

>* **for**

>* **do while**

### while语句

~~~text

语法结构:

while(表达式)

循环语句;

~~~

说明:

>1. 当**while**后面的表达式为真时即非0,则执行循环语句,完成一次循环之后再来判断表达式的值,重复操作,直到表达式的值为假即0时,结束循环,该条**while**语句就执行完毕了。属于前测循环

>2. 若循环语句包含一条以上的语句时,应该用花括号括起来,不括起来的话,就只有**while**后面的第一条语句才是循环体语句

>3. **while**语句中也有**break**,在循环中只要遇见**break**,就会停止后期的所有的循环,跳出循环语句,永久终止循环

>4. **while**语句中有**continue**语句,该语句用于终止本次循环。运行到这里时,**continue**后面的代码就不会再执行了,而是直接跳到**while**语句后面的判断表达式部分,进行下一次循环的入口判断

代码举例:

一个包含**while**语句,**break**语句和**continue**语句的代码

~~~c

#include

int main()

{

int i = 1,x = 1;

while(i <= 20)

{

if(x >= 10)

break;

//当x>=10这个条件成立时,执行break跳出循环,

//执行printf函数的那条语句

if(x % 2 == 1)

{

x += 5;

continue;

//当x%2==1这个条件成立时,执行continue,结束本次循环,

//回到while后面判断i<=20这条语句

}

x -= 3;

i ++;

}

printf("i= %d,x= %d\n",i,x);

return 0;

}

~~~

效果:

![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093612_cfe6b650_8907017.png "PF1F`_@H7T[I0CV~8U37%7I.png")

代码图解:

![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093625_fc5de5b2_8907017.png "break,continue,while.png")

### for 循环

~~~text

语法结构:

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

循环语句;

~~~

说明:

>1. **表达式1**为初始化部分,用于初始化循环变量的。

>

>​ **表达式2**为条件判断部分,用于判断循环时候终止。

>

>​ **表达式3**为调整部分,用于循环条件的调整。

>

>2. **for**( ; ; )无条件,无论如何都为真

>

> **for**(xx; ;xx)表达式2不写就没有了判断条件,为死循环,需要靠**break**语句跳 出循环

>

>​ **for**( ;xx; )表达式1不写,可以在for循环之前初始化循环变量,

>

>​ 表达式2不写,可以在循环过程中改变循环控制变量的值

>

>3. **for**循环中也可以出现**break**和**continue**,他们的意义和在**while**循环中是一样的。 但是还是有些差异,比如使用**continue**时,**for**循环continue后结束本次循环后,仍然会进行循环条件的调整使循环继续;**while**循环就极有可能跳过循环调整部分导致死循环

>

>4. 关于**for**的二三建议:

>

> (1)不可在for 循环体内修改循环变量,防止 for 循环失去控制。

>

> (2) 建议for语句的循环控制变量的取值采用“前闭后开区间”写法,比如这样写for(i = 0; i < 10; i ++);这样i在一定程度上有了意义,代表了10次循环

代码举例:

关于**continue**在**while**循环和**for**循环中的区别

~~~c

//在while循环中

#include

int main()

{

int i = 1;

while(i <= 10)

{

if(5 == i)

continue;

//当i==5时,这个continue结束本次循环,进行while判断,

//并没有对变量i进行调整,导致i一直等于5,死循环了

printf("%d ",i);

//因此输出部分只打印了1 2 3 4,然后就死循环了

i++;

}

return 0;

}

~~~

~~~c

//在for循环中

#include

int main()

{

int i = 0;

for(i = 1; i <= 10; i++)

{

if(5 == i)

continue;

//当i==5时,这个continue结束了本次循环,回到for循环语句,

//此时对变量i进行了调整,i等于6了,循环继续

printf("%d ",i);

//因此输出部分打印了1 2 3 4 6 7 8 9 10,只是跳过了5

}

return 0;

}

~~~

效果:

![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093655_674767bd_8907017.png "continue效果异.png")

### do while语句

~~~text

语法结构:

do

循环语句;

while(表达式);

~~~

说明:

>1. **do while**语句就是一种先斩后奏的后测循环,先执行循环体语句,然后求表达式的值。若表达式的值为非0即为真,返回继续执行循环体语句,如此重复,直到表达式的值为0即条件为假,结束循环。

>2. **do while**循环语句中**break**和**continue**仍然适用

>3. **while**后面的表达式后记得加一个分号

代码举例:

**do while**语句中**break**和**continue**的应用

~~~c

#include

int main()

{

int i = 1;

do

{

if(5 == i)

//在这里最好写成5==i,虽然意义和i==5一样,

//但是它可以防止意外将==(等号)写成=(赋值),因为5是常数不可以被赋值改变

break;

//当i==5时,跳出循环

printf("%d ",i);

i++;

}while(i <= 10);

return 0;

}

~~~

~~~c

#include

int main()

{

int i = 1;

do

{

if(5 == i)

continue;

//当i==5时,结束本次循环,直接判断i<=10,跳过了i++,

//变量i无法调整,进入死循环

printf("%d ",i);

i++;

}while(i <= 10);

return 0;

}

~~~

效果:

![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093719_b22390ee_8907017.png "do while.png")

## 三、goto语句

~~~c

语法结构:

goto 语句标号;

语句标号:

//语句标号可以放在自己想要放在某一语句行的前面

~~~

说明:

>1. **goto**语句称为无条件转移语句,在实践中最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,比如一次跳出多层循环

>2. **goto**语句不可滥用否则会造成程序结构的紊乱

代码举例:

~~~c

for(...)

for(...)

{

for(...)

{

if(disaster)

goto error;

}

}

....

error:

if(disaster)

//处理错误

~~~

一键复制

编辑

Web IDE

原始数据

按行查看

历史

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值