C语言菜鸟到大牛的蜕变(二)

分支与循环语句


 分支语句:

  •         if
  •         switch  

循环语句 

  • while
  • for
  • do while

go to语句 


C语言中的语句——由一个;隔开的就是一条语句

C语言中的三种结构——顺序结构;选择结构;循环结构


分支语句(选择结构)

如果你加入内卷,可能会取得成功

如果你完全躺平,一定不会有好结果

像这样的就是选择,C语言如何实现:

if语句

语法结构:

  • if(表达式)

             语句;

  • if(表达式)

            语句1;

       else

            语句2;

    //多分支

  • if(表达式)

           语句1;

       else if(表达式)

           语句2;

       else

           语句3;

注:表达式是判断条件真假的,C语言中0表示假,非0表示真


if语句实现 

示例代码:


#include<stdio.h>

int main()

{

int a;

printf("你要加入内卷吗,请选择:>0\1  \n");

scanf("%d\n",&a);

if(a==1)

printf("取得成功\n");

else

print("不会成功\n");

return 0;

}

类比剩下两种语法


如果条件成立,要执行多条语句,应使用{  }放代码块

#include<stdio.h>

int main()

{

if(表达式)

{

语句列表1;

}

else

{

语句列表2;

}

return 0;

}


悬空else

代码见:

#include<stdio.h>

int main()

{

int a = 0,b = 2;

if(a == 1)

     if(b == 2)

          printf("haha\n");

else

     printf("heihei\n");

return 0;

}

这段代码的运行结果是什么都不打印;

程序进行到a==1时,判断为假所以不会再继续下面语句直接到return 0;

那么不懂得铁铁们就要问了,为什么呢,不是还有else呢么;

告诉各位铁铁这个没有明确清楚的代码形式时,else总是与离它最近的if相匹配;

所以大家写代码时要注意自己的代码风格;


swith语句

语法结构

switch(常量表达式

{

语句项;

}

语句项指的是一些case语句如下:

case常量表达式:

        语句;


switch通常用于多分支的情况,因为使用if....else if...else if...else 的形式太麻烦,所以就有了另一种语法形式——switch语句

比如:

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期七


#include<stdio.h>

int main()

{

int day=0;

scanf("%d\n",&day);

switch(day)

{

case 1:

printf("星期一\n");

case 2:

printf("星期二\n");

case 3:

printf("星期三\n");

case 4:

printf("星期四\n");

case 5:

printf("星期五\n");

case 6:

printf("星期六\n");

case 7:

printf("星期七\n");

}

return 0;

}

这种形式的代码如果输入1的话,电脑会把星期从一到七全部打印出来;

从case1进去后就顺着执行剩下的情况不会跳出;

就像如过输入3,电脑会从case3进去然后一直运行到程序最后;

为了解决这种情况就出现了break;

纠正:

#include<stdio.h>

int main()

{

int day=0;

scanf("%d\n",&day);

switch(day)

{

case 1:

printf("星期一\n");

break;

case 2:

printf("星期二\n");

break;

case 3:

printf("星期三\n");

break;

case 4:

printf("星期四\n");

break;

case 5:

printf("星期五\n");

break;

case 6:

printf("星期六\n");

break;

case 7:

printf("星期七\n");

break;

}

return 0;

}

像这样如果把case比作入口break就像是出口直接跳到程序最后;

switch语句中,没有办法直接实现分支,需要搭配break才能实现真正的分支

根据需要灵活使用break

1~5输出工作日,6、7输出周末

#include<stdio.h>

int main()

{

int day=0;

scanf("%d\n",&day);

switch(day)

{

case 1:

case 2:

case 3:

case 4:

case 5:

printf("weekday\n");

break;

case 6:

case 7:

printf("weekend\n");

break;

}

return 0;

}

break语句的实际效果是把语句列表划分为不同的部分

编程的好习惯

default子句

如果表达式的值与所有的case标签的值都不匹配怎么办?

其实也没什么,就是所有的语句都被跳过而已,程序也不会终止,也不会报错,因为这种情况C中并不认为适合错误。

但是,如果你并不想忽略不匹配所有标签的表达式的值时怎么办呢?

可以在语句列表中增加一条default子句——default;写在任何一个case可以出现的位置,当switch表达式的值并不匹配所有的case情况时,这个default子句后面的语句就会执行。所以每个switch语句中只能出现一条default子句。

但是它可以出现在语句列表中的任何位置,而且语句流就会像贯穿一个case标签一样贯穿default子句

在每个switch语句中都放一条default子句是个好习惯,甚至可以在后边再加一个break语句


 循环语句 (循环结构)

while循环

上面已经介绍了if语句

当条件成立的情况下,if语句后的语句执行,否则不执行。但这个语句只会执行一次。

但生活中很多的实际例子是:同一件事情我们需要完成很多次就像学习。

C语言为了解决这个引入了while语句,可以实现循环

语法结构

while(表达式)

           循环语句;

表达式也是判断条件真假的,条件为真则进入循环


while语句执行流程:

基本语法理解

在屏幕打印1~10的数字

#include<stdio.h>

int main()

{

int i = 0;

while(i<=10)

{

printf("%d ",i);

i++;

}

return 0;

}

帮助我们理解while语句的基本语法

while语句中的break与continue


break:

//代码示例

#include<stdio.h>

int main()

{

int i = 0;

while(i<=10)

{

if(i == 5)

   break;

printf("%d ",i);

i++;

}

return 0;

}

屏幕打印:1 2 3 4

注:break在while循环中的作用:

在循环中只要遇到break,就停止后期所有的循环,直接终止循环,while中的break是永久终止循环的。


continue:

//代码示例

#include<stdio.h>

int main()

{

int i = 0;

while(i<=10)

{

if(i == 5)

   continue;

printf("%d ",i);

i++;

}

return 0;

}

这里屏幕输出的是:1 2 3 4 死循环

#include<stdio.h>

int main()

{

int i = 0;

while(i<=10)

{

i++;

if(i == 5)

   continue;

printf("%d ",i);

}

return 0;

}

这里屏幕输出的是:1 2 3 4 6 7 8 9 10

注:continue在while循环中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下次循环的入口判断


看一个代码:

#include<stdio.h>

int main()

{

int ch = 0;

while ((ch = getchar()) != EOF)

     putchar(ch);

return 0;

}

getchar()——从键盘上获取字符等价于scanf("%c",&ch);

putchar()——把获取字符打印在屏幕上


for循环

语法结构:

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

     循环语句;

表达式1——循环变量初始化;

表达式2——条件判断部分,用于判断循环合何时终止;

表达式3——调整部分,循环条件的调整;


for循环打印1~10数字

#include<stdio.h>

int main()

{

int i = 0;

//for(i=1/*初始化部分*/;i<=10/*判断部分*/;i++/*调整部分*/)

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

printf("%d ",i);

return 0;

}

for循环的流程执行图:

对比for循环与while循环,可看出for循环风格更胜一筹,同时for循环的使用次数也是最高的

for循环中的break与continue与在while循环中的意义是一样的

for语句的循环控制变量

建议:

  1. 不可在for循环体内修改循环变量,防止for循环失去控制
  2. 建议for语句的循环控制变量的取值采取前开后闭区间的写法

eg:

int i = 0;

//前开后闭写法

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

{}

//两边都是闭区间

for(i = 0; i <= 9 ; i++)

{}


do...while循环

do语句语法:

do

循环语句;

while(表达式);

do...while循环语句执行流程:

do语句的特点

循环至少执行一次,使用的场景有限,所以不是经常使用

#include<stdio.h>

int main()

{

int i = 10;

do

{

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

}while(i<10);

return 0;

}

break和continue具体分析


       害~隔了挺长时间才更一个原因是在等时机,还有一个原因是期末考试复习紧张,一下这么多内容希望这个系列能对大家有帮助,一起加油!!!

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值