当前位置: 首页 > news >正文

【C语言】分支与循环(循环篇)——结尾猜数字游戏实现

前言

C语言是一种结构化的计算机语言,这里指的通常是顺序结构、选择结构、循环结构,掌握这三种结构之后我们就可以解决大多数问题。

分支结构可以使用ifswitch来实现,而循环可以使用forwhiledo while来实现。

1. while循环

C语言中提供了三种循环语句,while就是其中一种。

1.1 while 与 if 的对比

while的语法:

while(表达式)语句;

具体我们可以通过与if语句对比一下来观察:

//代码1
int main()
{if(1)printf("hello\n");return 0;
}
int main()
{while(1)printf("hello\n");return 0;
}

通过运行我们可以发现,if语句只能执行一次后面的打印语句,而while循环可以一直打印。

1.2 while语句的执行流程

在这里插入图片描述
首先执行判断表达式,如果表达式值为0(为假),循环直接结束;表达式的值不为0(为真),则执行循环语句,语句执行后再继续进行判断。

1.3 while循环实践

比如:循环打印1~10的值

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

在这里插入图片描述

2. for循环

通常for循环是循环中使用最多的,语法如下:

2.1 语法形式

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

在这里表达式1用于初始化循环变量,表达式2用于循环结束条件的判断,表达式3用于循环变量的调整。

2.2 执行流程

在这里插入图片描述
进入循环首先执行表达式1初始化循环变量,然后执行表达式2进行判断,如果表达式2的结果为0,则 循环结束;表达式2不为0则执行循环语句,执行完成后,再执行表达式3调整循环变量,然后再进行表达式2判断。

整个循环中,表达式1的初始化部分只执行1次,接下来就是表达式2循环语句表达式3在循环。

2.3 for循环实践

还是以打印1~10的值为例:

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

在这里插入图片描述

3. do-while循环

3.1语法形式

一般do while循环使用的语句比较少,它的语法如下:

do语句;
while(表达式)

while 循环for循环都是先判断再进入循环,而do while循环是先进入循环体执行循环语句,再执行while后的判断表达式,表达式为真就进行下一次循环,为假则跳出不再循环。

3.2 执行流程

在这里插入图片描述

3.3 do while 循环的实践

这里我们还是以打印1~10的值为例:

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

在这里插入图片描述

4. break和continue语句

在执行循环的时候,我们经常会遇到某些情况需要提前终止循环,而在C语言中提供了breakcontinue两个关键字:

  • break的作用是永久终止循环,只要break执行,那么就会直接跳出循环,执行当前循环外的语句。
  • continue的作用是跳过本次循环continue后边的代码,进行下一轮循环。

4.1 while循环中的break和continue语句

4.1.1 break举例

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

这时我们再来看看结果:
在这里插入图片描述
这里我们可以看到,只打印到了7就停止了,这是因为i在等于8的时候就执行了break语句,直接跳出了整个循环,所以只打印到了7就停止。

4.1.2 continue举例

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

在这段代码中的结果是会造成死循环,因为continue的特点是跳过当次循环后的代码,所以当 i 循环一直到值为 8 的时候,就会跳过后面的 printf 和 i++ 语句,导致 i 的值一直为 8 ,造成程序死循环,所以要避免将 continue 放在调整语句之前。

4.2 for循环中的break和continue

4.2.1 break举例

和 while 循环一样, for 循环中的 break 也是用于终止循环,只要执行到了break循环就彻底终止:

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

在这里插入图片描述
所以当 i 等于 8 的时候,break执行,跳出循环,结果打印1~7。

4.2.2 continue举例

如果把上面的代码中的break换成continue会什么结果:

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

在这里插入图片描述
这里打印了1~10,但是没有打印8,这是因为当 i == 8 的时候, continue执行跳过了打印的语句,但是调整语句 i++ 在continue之前,所以 i 继续自增,变成 9, 不满足 if 语句,跳过continue,继续执行printf语句,所以结果没有打印 8。

4.3 do while循环中的break和continue语句

do while 语句中的break和continue作用与 while 循环中几乎一样,这里不再叙述。

5. goto语句

C语言中还提供了一种方法,就是goto语句和跳转标号,它可以实现在同一个函数内跳转到设置好的标号处。

比如:

int main()
{printf("hello\n");goto next;printf("world\n");next:printf("跳过了world的打印\n");return 0;
}

在这里插入图片描述
goto语句如果使用不好就会导致在函数内乱跳转;但也并非全是缺点,如果在多层循环代码中想要快速跳出,那么使用goto就会很方便:

for(...)
{for(...){for(...){if(表达式)goto next;}}
}
next:

如果我们使用break的话,一次只能跳出一层循环,想全部跳出需要3个break,但使用goto的话,满足条件直接跳出所有循环,就会更加快捷。

6. 猜数字游戏

当我们了解了分支与循环的结构之后,就可以尝试着写一个猜数字的小游戏,在控制台展示出来:

不过,在写之前我们还要先了解几个函数,因为在游戏里我们会用到它们:

6.1 rand、srand、time函数与随机数

6.1.1 rand函数

在写程序的时候,有很多时候需要用到随机数,于是我们就可以使用rand函数。如下所示:

int rand(void);

注:在使用rand函数时需要包含头文件

#include <stdlib.h>

但通过程序多试几次发现,rand函数实际上生成的是一个伪随机数,每次生成的数字都是一样的:
第一次:
在这里插入图片描述

第二次:
在这里插入图片描述
伪随机数并不是真的随机数,而rand函数生成的是基于一个叫种子的基准值进行运算从而生成的随机数。
之所以每次生成的随机数都是一样的,是因为种子的默认值为“1”。
如果想生成真正的随机数,那么就需要种子是一直变化的。

6.1.2 srand函数

C语言中又提供了一个函数叫srand,是用来初始化随机数生成器的。

void srand(unsigned int seed);

在调用rand函数前先调用srand函数,用过srand的参数设置rand函数的种子,这样每次生成的随机数就会变化。

6.1.3 time函数

而一般在写程序的时候,大多数时候都会使用时间做为种子,因为时间是一直在变化的。
在C语言中有一个函数叫time,可以返回当前的时间:

time_t time (time_t* timer);

使用time函数需要包含头文件:

#include <time.h>

如果只用time函数返回时间戳,那就可以写成:

time(NULL);

6.1.4 生成随机数

了解了这些这时就可以把代码改下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>int main()
{srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;
}

这时再看得到的结果:
第一次:
在这里插入图片描述
第二次:
在这里插入图片描述
这时得到的就是真正的随机数

6.2 代码实现

游戏要求:

  1. 自动生成1~100的随机数
  2. 根据玩家猜的数字电脑给出大了或者小了的反馈,直到正确。
//打印开始界面
void menu()
{printf("************************\n");printf("*******猜数字游戏********\n");printf("*********1.开始*********\n");printf("*********0.退出*********\n");printf("************************\n");
}//游戏主体
void game()
{//生成随机数,设定范围1~100以内int r = rand() % 100 + 1;//玩家要猜的数字int num = 0;while (1){printf("请猜数字:");scanf("%d", &num);if (num > r){printf("猜大了\n");}else if (num < r){printf("猜小了\n");}else{printf("恭喜你,猜对了!\n");break;}}
}int main()
{//用于选择开始游戏、退出游戏int input = 0;//设置种子,为了后面调用rand函数srand((unsigned int)time(NULL));do{//打印界面(封装为menu函数)menu();printf("请选择:");scanf("%d", &input);//根据玩家的输入来选择分支switch(input){case 1://游戏主体(封装为game函数)game();break;case 0:printf("退出游戏\n");break;default://对于输入0和1之外的处理printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

6.3 逻辑分析

6.3.1 main()函数

  1. 首先进入main函数,因为游戏一开始就要打印一个菜单,所以我们使用do while循环,do while的特点就是第一次直接进入循环语句。
  2. 先打印菜单,然后使用scnaf让玩家输入,根据玩家输入的值选择switch的分支语句,如果输入 1 就进入case1语句,开始游戏;选择 0 那么就提醒玩家退出游戏,接着break跳出,如果输入非 01 的数字就走default语句提示重新选择。
  3. 使用input做为循环条件是因为,如果玩家输入 1 进入游戏之后,无论输赢导致游戏结束,都会再让玩家选择一次,也就是再打印一次菜单,再scanf输入选择,避免了游戏结束直接退出程序。而玩家输入0的话,整个循环也就随着停止,及退出游戏,如果输入其他的,只要是大于0就会提示重新选择,然后再次循环。

6.3.2 game()函数

  1. 如果玩家选择了1进入游戏主体,首先生成一个1~100的随机数并赋值给r
  2. 创建一个num变量用于玩家输入,并且因为猜数字很难一次猜对,所以输入的动作我们也放在循环里。
  3. while循环让他一直循环,内部就是一个比较的过程,根据玩家输入的数字走不通的分支并进行提示,直到猜对之后break跳出循环。

6.4 运行结果

在这里插入图片描述

相关文章:

【C语言】分支与循环(循环篇)——结尾猜数字游戏实现

前言 C语言是一种结构化的计算机语言&#xff0c;这里指的通常是顺序结构、选择结构、循环结构&#xff0c;掌握这三种结构之后我们就可以解决大多数问题。 分支结构可以使用if、switch来实现&#xff0c;而循环可以使用for、while、do while来实现。 1. while循环 C语言中…...

【数据结构】链表篇

文章目录 1.链表的概念以及结构2.链表的分类2.1 单向或者双向2.2 带头或者不带头2.3 循环或者不循环2.4 无头单向非循环链表和带头双向循环链表 3.单链表的实现3.1 准备工作3.2 节点的创建3.3 单链表的释放3.4 打印链表3.5 单链表的尾插3.6 单链表的尾删3.7 单链表头删3.8 单链…...

Python SciPy介绍

在数据科学和工程领域&#xff0c;Python已经成为了一个不可或缺的工具&#xff0c;这主要得益于其强大的库和框架支持。其中&#xff0c;SciPy库作为Python科学计算的核心库之一&#xff0c;为研究人员、工程师和数据分析师提供了大量高效的算法和数学工具。本文将带您深入了解…...

docker镜像源

1、直接在服务器上创建这个文件&#xff0c;将镜像源配置在里面 /etc/docker/daemon.json {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com&qu…...

【clion】clion打开文件目录卡死问题

巨卡&#xff0c;几乎无法打开&#xff0c;据说是fsnotifier64.exe 被限制了。删除 火绒就好了。 关闭windows defender 官方&#xff1a;关闭 Windows 安全中心中的Defender 防病毒保护 此时&#xff0c;删除火绒&#xff1a; 界面变这样了&#xff1a;...

[CR]厚云填补_GridFormer

GridFormer: Residual Dense Transformer with Grid Structure for Image Restoration in Adverse Weather Conditions Abstract 恶劣天气条件下的图像恢复是计算机视觉中的一个难点。在本文中&#xff0c;我们提出了一种新的基于变压器的框架GridFormer&#xff0c;它可以作为…...

PostgreSQL数据库内核(二):通过initdb传递guc参数

目录 增加guc参数 initdb参数传递 pg_ctl参数传递 参数验证 新增guc参数pg_test_parameter&#xff0c;支持从initdb和pg_ctl命令中传递/覆盖参数&#xff0c;使用场景是TDE透明加密指定算法或者某些定制化需求。 增加guc参数 pg源码是这样描述guc参数的&#xff1a;它是全局…...

rust常用的宏使用记录(九)

matches! 宏使用 matches! 是 Rust 标准库中一个非常有用的宏&#xff0c;它允许你方便地匹配一个表达式的结果是否符合某个模式。它的基本用法如下&#xff1a;matches!(expression, pattern) 这个宏返回一个布尔值&#xff0c;如果 expression 匹配 pattern&#xff0c;则返回…...

【Python机器学习】支持向量机——手写数字识别问题

基于SVM的数字识别步骤&#xff1a; 1、收集数据&#xff1a;提供的文本文件 2、准备数据&#xff1a;基于二值图像构造向量 3、分析数据&#xff1a;对图像向量进行目测 4、训练算法&#xff1a;采用两种不同的核函数&#xff0c;并对径向基核函数采用不同的设置来运行SMO算法…...

学习笔记-Cookie、Session、JWT

目录 一、验证码的生成与校验 1. 创建生成验证码的工具类 2. 写一个 Controller 3. 实现验证码验证 1. 获取验证码 2. 验证码请求过程 3. 验证码的校验 4. 原理说明 5. 验证 6. 总结 二、JWT登录鉴权 1. 为什么要做登录鉴权&#xff1f; 2. 什么是 JWT 3. JWT相比…...

题海战术,面试必胜秘诀

目录 1.Java 的优势是什么&#xff1f;2.什么是 Java 的多态特性?3.Java 中的参数传递是按值还是按引用?4.为什么 Java 不支持多重继承?5.什么是 Java 中的不可变类?总结 题目 来自面试鸭刷题神器 1.Java 的优势是什么&#xff1f; Java 的跨平台性、垃圾回收机制以及其强…...

设计模式详解(十九)——命令模式

命令模式简介 命令模式定义 命令模式&#xff08;Command Pattern&#xff09;是一种在面向对象程序设计中常用的行为型设计模式。命令模式的核心思想在于将请求封装成一个对象&#xff0c;从而使发出请求的责任和执行请求的责任分割开。它可以让请求发送者和请求接收者之间消…...

实战:MySQL数据同步神器之Canal

1.概叙 场景一&#xff1a;数据增量实时同步 项目中业务数据量比较大&#xff0c;每类业务表都达到千万级别&#xff0c;虽然做了分库分表&#xff0c;每张表数据控制在300W以下&#xff0c;但是效率还是达不到要求&#xff0c;为了提高查询效率&#xff0c;打算使用ES进行数…...

5.6软件工程-运维

运维 系统转换系统维护系统评价练习题 系统转换 新老系统的转换 系统转换是指&#xff1a;新系统开发完毕&#xff0c;投入运行&#xff0c;取代现有系统的过程&#xff0c;需要考虑多方面的问题&#xff0c;以实现与老系统的交接&#xff0c;有一下三种转换计划&#xff1a; …...

在JavaScript中如何确保构造函数只被new调用

构造函数是一个特殊的函数&#xff0c;用于初始化一个新创建的对象。它是在创建对象时自动调用的。构造函数通常用于为对象的属性赋值&#xff0c;或者执行其他必要的设置。 使用函数名大写字母开头&#xff0c;这是一种命名约定&#xff0c;用于区分构造函数和普通函数。如何…...

【数据结构算法经典题目刨析(c语言)】反转链表(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述&#xff1a; 二、思路分析 &#xff1a; 通过三个指针n1,n2,n3来实现链表的反转 1.首先初始化 n1为…...

机器学习之争:Python vs R,谁更胜一筹?

一、引言 随着人工智能和大数据的迅速发展&#xff0c;机器学习已成为现代科技的重要组成部分。在医疗、金融、零售、制造等多个领域&#xff0c;机器学习技术的应用无处不在。从数据分析到预测建模&#xff0c;再到深度学习&#xff0c;机器学习正在改变我们的工作和生活方式…...

Vulnhub靶机:JANGOW_ 1.0.1

目录 前言&#xff1a; 一、安装虚拟机Jangow&#xff1a;1.0.1靶机 二、Web部分 前言&#xff1a; 难度&#xff1a;简单&#xff0c;本文使用VirtualBox打开&#xff0c;下载地址&#xff1a; https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 一、安装虚拟机J…...

Python脚本实现USB自动复制文件

USB驱动器作为常见的数据存储设备&#xff0c;经常用于数据传输和备份。 然而&#xff0c;我们在手动处理文件复制可能效率低下且容易出错。 因此&#xff0c;我们可以利用Python编写脚本来自动化这一过程&#xff0c;提高效率和数据安全性。 准备工作 首先&#xff0c;我们需…...

【C++学习第19天】最小生成树(对应无向图)

一、最小生成树 二、代码 1、Prim算法 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 510, INF 0x3f3f3f3f;int n, m; int g[N][N]; int dist[N]; bool st[N];int prim() {memset(dist, 0x3f, sizeof di…...

第一个 Flask 项目

第一个 Flask 项目 安装环境创建项目启动程序访问项目参数说明Flask对象的初始化参数app.run()参数 应用程序配置参数使用 Flask 的 config.from_object() 方法使用 Flask 的 config.from_pyfile() 方法使用 Flask 的 config.from_envvar() 方法步骤 1: 设置环境变量步骤 2: 编…...

利用 Angular 发挥环境的力量

一.介绍 您是否曾想过如何在不同的环境中为同一应用设置不同的颜色、标题或 API 调用&#xff1f;可以肯定的是&#xff0c;生产 API 和测试 API 是不同的&#xff0c;应谨慎使用。部署时&#xff0c;我们不会在项目的所有地方手动更改所有 API 调用。不应这样做&#xff0c;因…...

Vue3+TypeScript+printjs 实现标签批量打印功能

前言&#xff1a;临时性需求没怎么接触过前端&#xff0c;代码实现有问题及优化点希望大佬可以留言告知一下 开发工具&#xff1a;VS CODE 界面开发&#xff1a;Vue3TypeScriptElementPlus 打印组件&#xff1a;Print-JS 前端打印入口图&#xff1a; 标签页面&#xff1a; …...

微信文件如何直接打印及打印功能在哪里设置?

在数字化时代&#xff0c;打印需求依旧不可或缺&#xff0c;但传统打印店的高昂价格和不便操作常常让人头疼。幸运的是&#xff0c;琢贝打印作为一款集便捷、经济、高效于一体的网上打印平台&#xff0c;正逐渐成为众多用户的首选。特别是通过微信小程序下单&#xff0c;更是让…...

dataX -20240804-master分支

1、相关报错 Error: java.io.IOException: java.lang.RuntimeException: ORC split generation failed with exception: org.apache.orc.impl.SchemaEvolution$IllegalEvolutionException: ORC does not support type conversion from file type struct<nanos:int> (10)…...

【网络】传输层

传输层 一、预备知识1、端口号1、端口号范围划分2、知名端口号3、两个问题4、netstat && iostate5、pidof6、谈下面协议始终铭记两个问题 二、UDP协议&#xff08;简单&#xff09;1、UDP协议端格式2、UDP的特点3、面向数据报4、UDP缓冲区 三、TCP协议&#xff08;重点…...

学生管理系统之更新和删除、筛选

学生管理系统之更新和删除 建立新的窗口 添加组件 进行布局 使用Widget把二个放在一块,作为一列,然后全选进行栅格布局,最后添加弹簧进行微调。 编写增加的槽函数 在主函数中调用对话框...

教您一键批量下载拼多多批发图片信息,节省时间

图片是电商的核心展示手段&#xff0c;高质量、吸引人的图片能显著提升商品吸引力&#xff0c;增强用户体验&#xff0c;促进购买决策。良好的视觉呈现有助于品牌形象的塑造&#xff0c;提高转化率和客户满意度&#xff0c;对电商平台的流量和销售业绩具有直接影响。 使用图快…...

基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…...

去噪扩散恢复模型

去噪扩散恢复模型 Bahjat Kawar 计算机科学系 以色列海法理工学院 bahjat.kawarcs.technion.ac.il Michael Elad 计算机科学系 以色列海法理工学院 eladcs.technion.ac.il Stefano Ermon 计算机科学系 美国加利福尼亚州斯坦福大学 ermoncs.stanford.edu …...

艺术作品欣赏网站/快速排名新

2019独角兽企业重金招聘Python工程师标准>>> 我的环境:ubuntu server 14.04.1 能上网 在网上找了mail的使用,尝试了N次,发送了就是收不到;过会终端就显示一行:You have a email /var/mail/gaohb 以下是那三种方法: mail -s test 420451465qq.com #第一种方法&…...

品牌网站建设 磐石网络的确好/网址查询服务器地址

1、IPAD中papership和电脑端无法同步 解决方法&#xff1a;将这个文件复制到目录下 然后在iPad里重新verify一下https://junlu.club:5006/zhangwei 2、添加标签 然后再左侧指派颜色 3、插入文献到word中 (3条消息) 标准论文参考文献添加方法——Zotero入门使用教程_MISAYAON…...

威海住房建设局网站/网站建设公司哪家好

目录 box2dbox2d安装基本用法高级话题编辑本段box2d Box2D是一个用于模拟2D刚体物体的C引擎。作者为Erin Catto。Box2D使用zlib许可。zlib许可是一个自由软件授权协议&#xff0c;但并非copyleft。它已被用于蜡笔物理学、愤怒的小鸟、Rolando、Fantastic Contraption、Incredib…...

聊城做网站建设/网络舆情报告

我是一名非计算机专业的在职人员&#xff0c;工作稳定&#xff0c;没什么压力。学计算机从大学时代就开始了&#xff0c;刚开始是玩html建站&#xff0c;后来发展到delphi写点代码辅助玩游戏。工作以后圈子改变了&#xff0c;对这方面的应用渐行渐远。回头一个看delphi已经没人…...

网站开发 上海/网络维护公司

手写vue响应式原理 首先我们看看原生 vue 做了什么 <script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script> <script>const vm new Vue({data: {name: 小米,arr:[{a:2}] // 检测深度响应式}})console.log(vm, vm) </s…...

德宏商城网站建设/专业软文代写

本节书摘来自异步社区《Android平板电脑开发秘籍》一书中的目录&#xff0c;作者 【印度】B.M. Harwani&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 目 录 第1章 Android平板电脑应用程序概述第2章 Fragment第3章 Action中的ActionBar 3.1 技巧&#xff1…...