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官网的管理平台;我这里是安装的其他开…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
