分支语句与循环语句(二)

循环语句

while

for

do while

while循环

我们已经掌握了if语句:【注:条件为真,语句执行

if(条件)

语句;

条件满足的情况下,if语句后的语句执行·;否则不执行。

但是这个语句只会执行一次

但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次

那我们该怎么做呢?C语言中给我们引入了:while语句,可以实现循环

如:

int main(){

                  while(1)                   //这里恒为真,会一直循环

                   printf("hehe\n");

                   return 0;

}
 

while语法结构:

while(表达式)

循环语句;

条件表达式若为真,则会进入循环语句,然后再到条件表达式中去判断,依次往复,直至为假,跳出循环。

while语句执行执行的流程:

这里expr指表达式,!=0指非0, stmt指语句

打印1~10

int main(){
             int i=1;
             printf("%d ",i);
             i++;                 //这里指打印为1,但我们想依次打印,就加上了i++
             return 0;
}

添加循环:

int main(){
             int i=1;
             while(i<=10){
             printf("%d ",i);
             i++;
             }
             return 0;
}

大家可以去试着去运行这串代码,这里在提一点——如果以后想看代码具体如何执行,可以按F10或Fn+F10,打开监视窗口(调试状态下),这也是判断代码出错的原因的方法

在看一串代码

int main(){
            int i=1;
            while(i<=10){
                           if(i==5)
                           break;
                           printf("%d ",i);
                           i++;
                         }
            return 0;
}

打印结果1 2 3 4 

这里的break是指如果i等于5的话,由于break是停止的意思,即跳出循环,所以5就没有打印了。

也就是说未来如果在循环里面,我希望哪一个条件满足的情况下,循环停止的话,就可以用到break。

若将break换成continue的话——

打印结果为1 2 3 4 ,但这时光标会一直在闪,没有截止也没有终止

若这个程序截止的话,会出现“按任意键继续”,但这个程序并没有结束,而是陷入了死循环

补充:continue是继续的意思。

i不等于5,代码往后走,但遇到continue则会不执行后面,再次进入循环。

continue的作用是当我们循环内部有机会执行道continue的时候,continue后面的代码便不再继续执行,直接认为这次循环结束了,再次来到while的条件表达式去判断。

简单来讲就是指跳过本次循环后面的代码

while(i<=10){

                     i++;

                     if(i==5)

                       continue;

                     printf("%d ",i);

}

总结:

1、break在while循环中的作用——在循环中只要遇到break,就停止后期的所有循环,直接终止循环。

所以,while中的break是用于永久终止循环的

2、continue在while循环中的作用——continue是用终止本次循环的,也就是本次循环中continue后面的代码不会在执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

代码1:

#include<stdio.h>
int main(){
           int ch=0;
           while((ch=getchar())!=EOF)
           putchar(ch);
           return 0;
}

这里while((ch=getchar())!=EOF)中

getchar——get获取  char字符——获取字符      意思:接受键盘输入的字符

整体意思是:获取一个字符后放到ch里面去,然后看获取的字符是不是EOF;如果等于EOF,那就把字符打印出来,也就是说这个循环只有获取到EOF才能够停下来,但不单单是这么简单。

补充:与输入getchar相对应是输出putchar;其实putchar与printf("%c\n",ch);是一样的,只是形式上的简洁区别

在分析:

int main(){

                    int ch=getchar();

                    putchar(ch);

                    printf("%c\n",ch);

                    return 0;

}

试着在调试窗口下输入e,则回车为ee。(当然其他字母也可以)

注意:这里并不是说输入EOF就会停止下来。

因为EOF在输进去的时候,一下子敲了三个字符,敲了个E,敲了O和敲E;那这个时候,getchar会读三次,读一个E打印,读一个O打印,读一个F打印就完了。

这里,getchar获取一个EOF的方式是在键盘上输入Ctrl+z,回车后程序结束

这是因为,getchar如果遇到ctrl+z的时候,getchar就会获取到EOF

EOF放到ch里面去,因EOF !=EOF为假,循环停止

EOF——end of file—— -1

它本身就是-1这样的值。(右击“EOF”点“转到定义”)会发现EOF是文件结束标志。有点像“\0”,但又不一样

未来,在学习文件的时候,一个空文件往这一放,第一次让你从里面去读一个字符的时候,会读出“EOF”。(当然这块知识后续在详细讲解。)

这里就引出了一个案例:

int main(){

                  int ret=0;

                  char password[20]={0};//password指密码,用数组来接受所输入的值;所以这里“0”不确定是多少。

                  printf("请输入密码:>");

                  scanf("%s",password);  //%s——字符

                  printf("请确认(Y/N):>");

                  ret=getchar();//接受‘Y’与‘N’

                  if(ret=='Y'){

                                         printf("确认成功\n");

                                   }

                   else{

                                printf("放弃确认\n");

                           }

                   return 0;

}

打印结果为:1 2 3 4 5 6

                      请确认(Y/N):>放弃确认

(这里123456指字符)

为何会出现这样的结果?

因为在输入密码123456后,按了回车键,而这操作被误认在键盘输入字符了。

回车键被getchar读取;在监视窗口下——可以看到这对应数值为10,说明ret里面放了“10”。

举例——

int main(){

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

                   return 0;

 }

这指打印出转义字符“\n” ,输出结果为十进制10

说明转义字符“\n”在ASCII码表中对应的就是十进制10.

这里还要在明白一个知识点:

 工作原理:scanf要读一个字符串的话;首先要去检测一个地方——输入缓冲区

输入缓冲区用来存放写数据,输入函数在接受数据的时候,会去看输入缓冲区有没有东西。

第一次去读的时候,输入缓冲区什么都没有;程序刚跑起来,在没有情况下,scanf等待你要输入的东西,一旦输入进去,缓冲区就有东西了;scanf函数就可以拿去缓冲区里想要的一部分,拿走之后,函数就过去了,之后getchar也会一样去看输入缓冲区是否有东西,没有就等待。

因为在键盘上输入123456+回车;这时,输入缓冲区就有了“123456\n”;但scanf函数在读这个字符串的时候,读密码的时候,是只把123456给读走了

因为“\n”不是输入的密码,只是让scanf去读取,但不会拿走。

而当“123456”被读走后,缓冲区只剩下一个“\n”;这时代码再往下走,来到getchar去读取,因缓冲区有“\n”,就把“\n”读走了。

拿到想要的东西后,就便不再等待,而是放到ret里面去,又因ret=\n不等于Y,就执行else语句。

(以上就是打印结果的原因。(问题所在))

解决方案:

将以上代码执行逻辑给纠正过来。

思路:清空输入缓冲区的内容(getchar读取时能等待)——读取一下‘\n’(读走)

方法:再加一个getchar();即可

再换思路:若把密码更改为123456 (空格)ABCD

这时scanf函数只会读取输入缓冲区(空格前的数);getchar();读取空格,然ret=getchar();读取ABCD\nY,就又会出现之前的问题。

这时会发现只有一个getchar是不行的。

思路:可以让getchar();多读几个字符,即加上while循环。

写成——

while( (ch=getchar())!='\n') ){

                                                 ;

                                           }

代码2:

#include<stdio.h>

int main(){

                int ch=0;

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

                                                                if(ch<'0'||ch>'9')    //只打印字符0到字符9的数字字符

                                                                continue;

                                                                putchar(ch);

                                                                 }

                     returnv 0;

}

只会输出数字字符,其他字符不会输出。(ASCII码表)

这里“||”操作符是“或”的意思

 if(ch<'0'||ch>'9') ——表示若ch小于字符0或大于字符9,就跳走了,满足其一即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值