C语言——分支与循环语句
目录
一.分支语句
1.if语句
2.悬空else问题
3.switch语句
default子句
二.循环语句
1.while循环
whle循环流程图:
break与continue
2.for循环
2.2for与while循环
2.3关于for循环的一道笔试题
3.do while 循环
三.猜数字游戏实现
四.goto语句
补充
scanf与getchar
最后
一.分支语句
1.if语句
作为c语言最常见的判断语句,几乎有关判断的场景都要用到if来实现
用if表达式中,表达式为真(非0)执行,为假(0)就停止执行。
2.悬空else问题
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}
执行该代码时,预期想打印haha,发现什么都没有打印,为什么?
因为:else与它最近的if匹配,第一个if判断为假,跳过下面的语句直接到return 0(第二个if与else可以说是捆绑在一起)
修改:
#include <stdio.h>
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2){printf("hehe\n");}}else{printf("haha\n");} return 0;
}
适当的使用{}可以使代码的逻辑更加清楚,写代码风格很重要!!
3.switch语句
swich语句常用于多分支的情况,比如要输出今天是星期几,如果用if来写,一堆的else if不方便,这时swich就派上用场了
用switch语句写出今天的日期
#include <stdio.h>
int main()
{int day = 0;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;
}
但有时多个分支的需求时一样的,如想要知道今天时周末还是工作日
#include <stdio.h>
//switch代码演示
int main()
{int day = 0;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;
}
default子句
如果表达的值与所有的case标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,case都不匹配时就跳到default子句执行,使得switch更加完整
补充:case与default子句在switch里的顺序没有固定(也就是说,它们可以出现在任何位置)
二.循环语句
1.while循环
在生活中,如果一件事情要做多次,光用if行不通,C语言给我们提供了while语句
whle循环流程图:

break与continue
break作用:与swich类似,它通常是在while中当某种条件达到时,跳出while循环。所以,while中的break是用于永久终止循环的
continue作用:它的翻译是:继续。但别被它的翻译带乱了,它是在程序执行到它时跳过在while中continue下面的语句,在进行循环。(慎用,容易使得while死循环!!)
2.for循环
我们已经知道了while循环,但是我们为什么还要一个for循环呢?
2.2for与while循环
用循环打印十个hehe
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{printf("hehe\n");i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{printf("hehe\n");
}
从代码上可以看出,相对于while,for在修改调整判断条件时更加有条理性,更不容易出错。在我们以后的学习里,for循环相对与while用的更多,尤其是在控制变量等相关问题上更容易控制!
continue与break在for循环语句的功能是一样的,这里就不展开说明。
2.3关于for循环的一道笔试题
//请问循环要循环多少次?
#include <stdio.h>
int main()
{int i = 0;int k = 0;for(i =0,k=0; k=0; i++,k++)k++;return 0;
}
答案是:0次,k在初始化是0,判断条件里已经符合,所以不进入for循环里面
3.do while 循环
循环至少执行一次,使用的场景有限,不经常使用。
三.猜数字游戏实现
学习了各种C语言的基本语句。现在,开动你聪明的大脑,用C语言来简单实现一个猜数字代码吧
下面是实现的代码:
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
void menu()
{printf("*******************\n");printf("**1.Play**2.Exit***\n");printf("*******************\n");
}
void game()
{int n = 5;int warld = rand()%100+1;//生成0到100的随机数//printf("%d\n", warld);int input = 0;printf("您有五次机会猜数字\n");while (n){printf("输入数字:");scanf("%d", &input);if (warld < input){printf("猜大了\n");}else if (warld > input){printf("猜小了\n");}else{printf("恭喜,猜对了\n");break;}n--;}if (n == 0){printf("五次机会已用完,挑战失败\n");}
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//时间戳实现每时每刻的随机数变化do{menu();printf("输入您的选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("非法,请重新输入:");break;}} while (input);return 0;
}
相信聪明的你一定是写出来了,怎么样?在实现出来的那一刻,是不是很有成就感!
四.goto语句
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。(用while循环代替) 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。 例如:一次跳出两层或多层循环。 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。 goto语言真正适合的场景如下:
for(...)for(...){for(...){if(disaster)goto error;}}…
error:if(disaster)
下面我们用goto语句来实现一个关机程序:
#include<stdio.h>
#inlcude<Windows.h>
#include<string.h>
int main()
{char passward[20] = { 0 };system("shutdown -s -t 60");
again:printf("你的电脑还有60秒就要关机,输入我是猪,取消关机\n");printf("输入:");scanf("%s", passward);if (strcmp(passward, "我是猪")==0){system("shutdown -a");printf("你很配合,取消关机\n");}else{goto again;}return 0;
}
不想用goto语句,也可以换成while循环来实现。
补充
scanf与getchar
scanf在缓冲区里读取数据,通常用于从键盘上获取数据来用于各项程序的需求。
在做题时,在要从用户里读取字符串时,scanf就有一个错误:
用它获取字符串时,在用户输入好后按回车(\n),因为字符串里可能包含空格就读取停止,后面的字符与\n就留在了缓冲区里:
#include<stdio.h>
int main()
{char a = 0;char password[20] = { 0 };printf("请输入密码>:\n");scanf("%s", password);printf("请确认(Y或N)>:");scanf("%c", &a);if (a == 'Y')printf("输入成功\n");elseprintf("取消成功\n");return 0;
}
当我在输入密码想再输出Y确定时,变成了下面的这种情形:

解决:用getchar()清空缓冲区(读掉\n)
int main()
{int a = 0;char password[20] = { 0 };printf("请输入密码>:\n");scanf("%s", password);getchar();printf("请确认(Y或N)>:");a = getchar();if (a == 'Y')printf("输入成功\n");elseprintf("取消成功\n");return 0;
}
但这种在遇到字符串中有空格就不起作用了!(scanf遇到空格,换行都认为是读取的结尾标志)
解决:用while一个一个读取,遇到\n才停止
int main()
{int a = 0;char password[20] = { 0 };printf("请输入密码>:\n");scanf("%s", password);while ((a = getchar()) != '\n'){;}printf("请确认(Y或N)>:");a = getchar();if (a == 'Y')printf("输入成功\n");elseprintf("取消成功\n");return 0;
}
用while循环加getchar()一个一个字符读(这种不仅能解决上面的问题,还能在用户输出空白字符时保证程序的正常运行!!)
所以,在我看来,如果以后我们要想避免这种问题,用gets接收字符串的方式更为稳妥点。
最后
感谢观看,有问题欢迎在评论区指正!
相关文章:
C语言——分支与循环语句
目录 一.分支语句 1.if语句 2.悬空else问题 3.switch语句 default子句 二.循环语句 1.while循环 whle循环流程图: break与continue 2.for循环 2.2for与while循环 2.3关于for循环的一道笔试题 3.do while 循环 三.猜数字游戏实现 四.goto语句 补充 …...
下载b站高清视频
需要使用的edge上的一个扩展插件,所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站,登录自己账号(登录后才能下载到高清!!)。打开一个视频,选择自…...
常见 JVM垃圾回收器、内存分配策略、JVM调优
垃圾收集( Garbage Collection ,下文简称 GC),垃圾收集的历史远远比 Java久远。经过半个世纪的发展,今天的内存动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么…...
【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】
目录 😋环境配置:华为HarmonyOS开发者 📺演示效果: 📖实验步骤及方法: 一、在media文件夹中添加想要使用的图片素材 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…...
【MySQL】:Linux 环境下 MySQL 使用全攻略
📃个人主页:island1314 🔥个人专栏:MySQL学习 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 背景 🚀 世界上主…...
Linux驱动开发 gpio_get_value读取输出io的电平返回值一直为0的问题
当时gpio子系统进行读取时返回必定是0 因此,首先必须使用platform驱动来管理gpio和pinctrl子系统,然后如果按照正点原子所教的设备树引脚设置为0x10B0则会导致读取到的电平值为0。 解决方法: 将设备树中的引脚设置为 pinctrl_gpioled: gpio…...
【数据结构】栈与队列(FIFO)
在阅读该篇文章之前,可以先了解一下堆栈寄存器和栈帧的运作原理:<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹,最先装进去的子弹最后射出来,最后装入的子弹…...
vue.js -ref和$refs获取dom和组件
在Vue.js中,ref和$refs是两个常用的属性,用于访问DOM元素和组件实例。下面分别详细解析这两个属性,并提供代码实例。 ref属性 ref属性用于给DOM元素或组件指定一个唯一的引用标识,在Vue实例中可以通过这个标识来访问对应的DOM元素…...
unity学习5:创建一个自己的3D项目
目录 1 在unity里创建1个3D项目 1.1 关于选择universal 3d,built-in render pipeline的区别 1.2 创建1个universal 3d项目 2 打开3D项目 2.1 准备操作面板:操作界面 layout,可以随意更换 2.2 先收集资源:打开 window的 AssetStore 下载…...
IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案
IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案 问题描述 在IEEE PDF eXpress上上传论文后,出现Font XXX is not embedded的问题。 该问题是指你所插入的图片等,没有将对应的字体嵌入进去。 解决方案 以下以Origin Lab图片…...
计算机网络 (21)网络层的几个重要概念
前言 计算机网络中的网络层是OSI(开放系统互连)模型中的第三层,也是TCP/IP模型中的第二层,它位于数据链路层和传输层之间,负责数据包从源主机到目的主机的路径选择和数据转发。 一、网络层的主要功能 路由选择…...
企业网络性能监控
什么是网络性能监控 网络性能监控(NPM)是指对计算机网络的性能进行持续测量、分析和管理的过程,通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标,确保网络高效、安全地运行,并将停机时间降至最低…...
halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
目录 一、gen_robot_tool_and_base_object_model_3d 函数调用二、gen_arrow_object_model_3d 函数调用 首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。 一、gen_robot_tool_and_base_object_model_3d 函数调用 RobotToolSize : 0.…...
容器技术思想 Docker K8S
容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前,程序直接部署在物理服务器上,依赖管理复杂,包括各类运行依赖,且易变,多程序混合部署时还可能产生依赖冲突,给程序…...
25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)
python环境没有安装的可以点击这里先安装好python环境,python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版(免费)和专业版(付费)。对于初学者和个人开发者而言,社区…...
Oracle job(定时任务)
1、job的作用 可以定时执行任务(分/次、时/次、天/次等) 2、创建job --创建job --注意点: --①job_no 为系统自动获取; --②存储过程名需要加‘;’ --③定时器开始执行时间可以填‘sysdate,表示立即执行 --④执行频…...
[python3]Excel解析库-xlwt
xlwt 是一个用于创建 Excel .xls 文件(即旧版的 Excel 97-2003 格式)的 Python 库。它允许你用 Python 编写程序来生成 Excel 文件,而不需要实际运行 Microsoft Excel 应用程序。请注意,xlwt 只支持写入 .xls 文件,并不…...
【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 题外话:trait的概念非常非常非常重要!!!整个第10章全都是Rust的重难点!&#x…...
大数据高级ACP学习笔记(2)
钻取:变换维度的层次,改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub...
K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令
K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台;我这里是安装的其他开…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
