C语言知识点汇总—— 分支和循环
掌握了前面学习的知识我们可以写一些有趣的代码本片文章重点介绍猜数字游戏的实现设计游戏1.每轮自动随机生成1~100之间的随机数2.玩家猜数字每猜一次反馈猜大了还是猜小了直到猜对了程序终止首先我们需要解决的问题是如何生成符合要求的随机数这个时候我需要给大家介绍一个C语言的库函数—— rand() 函数该函数的原型如下int rand (void);rand() 函数会返回一个伪随机数这个伪随机数的范围是从0~RAND_MAX这个 RAND_MAX 的大小是依赖编译器实现的但是大部分编译器上是32767。rand()函数的使用需要包含头文件stdlib.h我们测试一下 rand() 函数的效果#include stdio.h #include stdlib.h int main() { printf(%d\n, rand()); printf(%d\n, rand()); printf(%d\n, rand()); printf(%d\n, rand()); printf(%d\n, rand()); return 0; }这里我们调用5次得到5个随机数但是当我第二次运行这个代码时得到的结果跟上一次一摸一样我们可以看到虽然一次运行中产生的5个数字是相对随机的但是下一次运行程序生成的结果和上一次一摸一样这就说明有点问题。如果再深入了解一下我们就不难发现其实rand()函数生成的随机数是伪随机的。伪随机数不是真正的随机数是通过某种算法生成的随机数真正的随机数是无法预测下一个值是多少的。而 rand() 函数就是对一个叫“种子”的基准值进行运算生成的随机数之所以前面每次运行程序产生的随机数序列是一样的就是因为 rand() 函数生成随机数的默认种子是1如果要生成不同的随机数就要让种子是变化的。那么我们如何让种子变化起来呢C语言中又提供了一个函数叫srand是用来初始化随机数的生成器的函数原型如下void srand (unsigned int seed);程序中在调用 rand() 函数之前要先调用 srand() 函数通过 srand() 函数的参数 seed 来设置rand() 函数生成随机数的种子只要种子在变化每次生成地随机数序列也就变化起来了那也就是说给 srand() 函数的种子如果是随机的rand() 就能真正地生成随机数但是在生成随机数的时候又需要一个随机数这不就矛盾了吗这时我们就想到一个办法时间每分每秒在变化我们能不能用时间来作为我们需要的随机数呢在程序中我们一般是使用程序运行的时间来作为随机数的种子因为时间是时刻在变化的。在C语言中有一个函数叫做time它可以获得时间time 函数的原型如下time_t time (time_t* timer);time 函数会返回当前的日历时间其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值单位是秒。返回的类型是time_t 类型的time_t 类型本质上其实就是32位或者64位的整型类型。 time 函数的参数 timer 如果是非NULL的指针的话函数也会将这个返回的差值放在timer 指向的内存中带回去。如果 timer 是 NULL就只返回这个时间的差值。time函数返回的这个时间差也被叫做时间戳。time 函数的时候需要包含头文件time.h如果只是让 time 函数返回时间戳我们就可以这样写time(NULL);//调⽤time函数返回时间戳这⾥没有接收返回值那我们就可以让生成随机数的代码改写成如下#include stdio.h #include stdlib.h #include time.h int main() { //使⽤time函数的返回值设置种⼦ //因为srand的参数是unsigned int类型我们将time函数的返回值强制类型转换 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; }多运行几次看看每次的运行就有差异了。注截图只是当时程序运行的结果你的运行结果不一定和这个一样srand函数是不需要频繁调用的一次运行的程序中调用一次就够了现在我们已经解决了生成随机数的问题但是我们要求的随机数是要在1~100的范围之间我们如何控制在这个范围呢如果我们要生成0~99之间的随机数方法如下rand() % 100;//余数的范围是0~99如果要生成1~100之间的随机数方法如下rand()%1001;//%100的余数是0~99,0~99的数字1,范围是1~100如果要生成100~200的随机数方法如下100 rand()%(200-1001) //余数的范围是0~100加100后就是100~200所以如果要生成a~b的随机数方法如下a rand()%(b-a1)这也是我们总结出来的公式只要你想生成a~b之间的随机数直接套用上面的写法就行。以上就是我们所有的准备工作接下来就是猜数字游戏的实现了首先上来我们先要准备好需要用到的头文件#include stdio.h #include time.h #include stdlib.h然后我们想到上来就需要打印游戏菜单供我们选择假设玩家选择1是玩游戏选择0是退出游戏我们命名一个menu函数封装起来如下:void menu() { printf(--------------------------\n); printf(-------- 1.玩游戏 ---------\n); printf(-------- 0.退出游戏 -------\n); printf(--------------------------\n); }接下来我们来完成主函数的代码编写不管玩家是否选择玩游戏我们上来首先需要打印菜单并且玩家玩完一次还想玩可以继续选择因此我们应该使用do while循环由于 srand 函数只需要调用一次我们把 srand 函数放在循环的外面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(选择错误重新选择\n); break; } } while (input); return 0; }解析程序一运行起来就打印菜单让玩家作出选择用 input 变量接收如果选择1进入游戏选择0退出游戏并且下一次不会再进入循环如果输入其他数字提示玩家非法输入重新选择game()函数用来封装游戏的具体实现逻辑void game() { int r rand() % 100 1; int guess 0; while (1) { printf(请猜数字:); scanf(%d, guess); if (guess r) { printf(猜⼩了\n); } else if (guess r) { printf(猜⼤了\n); } else { printf(恭喜你猜对了\n); break; } } }考虑到玩家可能无法一次就猜中所以用while循环让玩家可以重复猜这里利用简单的if-else语句来判断玩家输入的数字是大了还是小了如果猜大了提示玩家猜大了猜小了提示玩家猜小了如果都不是那就是猜对了利用break跳出循环。将以上代码整理完整版如下#include stdio.h #include stdlib.h #include time.h void menu() { printf(-----------------------\n); printf(------- 1.玩游戏 ------\n); printf(------- 0.退出游戏 ----\n); printf(-----------------------\n); } void game() { int num rand() % 100 1; int guess 0; while (1) { printf(请猜数字:); scanf(%d, guess); if (guess num) { printf(猜大了\n); } else if (guess num) { printf(猜小了\n); } else { printf(恭喜你猜对了!\n); break; } } } int main() { srand((unsigned int)time(NULL)); int input 0; do { menu(); printf(请选择); scanf(%d, input); switch (input) { case 1: game(); break; case 0: printf(退出游戏\n); break; default: printf(输入错误请重新输入\n); break; } } while (input); return 0; }上面的代码就是可以直接运行的运行结果如下当然如果你还可以限制猜数字的次数比如只给玩家6次机会若6次机会用完游戏失败仅需要在game函数中添加一些代码如下void game() { int num rand() % 100 1; int guess 0; int count 6; while (count) { printf(\n你还有%d次机会\n, count); printf(请猜数字:); scanf(%d, guess); if (guess num) { printf(猜大了\n); } else if (guess num) { printf(猜小了\n); } else { printf(恭喜你猜对了!\n); break; } count--; } if (count 0) { printf(你失败了正确值是%d\n, num); } }游玩过程如下本篇到此结束感谢阅读如果觉得有帮助欢迎点赞支持。

相关新闻

计算占空比

计算占空比

无桥CukPFC变换器 采用单周期控制,开关频率100k今天我们来聊聊无桥Cuk PFC变换器,这东西在电源设计里可是个狠角色。首先,无桥Cuk PFC变换器的核心优势在于它能在不增加太多复杂性的情况下,实现高功率因数校正(PFC&am…

2026/7/7 21:07:35 阅读更多 →
电动汽车的续航里程一直是消费者和制造商关注的焦点。今天,我们来聊聊如何用MATLAB对电动汽车的续航里程进行研究和优化

电动汽车的续航里程一直是消费者和制造商关注的焦点。今天,我们来聊聊如何用MATLAB对电动汽车的续航里程进行研究和优化

MATLAB代码:电动汽车续航里程的研究分析与优化 关键词:电动汽车续航里程 可行性分析 理论公式 MATLAB 影响因素仿真平台:MATLAB 主要内容:本文首先综合对比了三种研究电动汽车续航里程的优化方法,并进行可行性分析&…

2026/7/8 11:28:59 阅读更多 →
Abaqus模拟中水力裂缝与天然裂缝相交的cohesive行为

Abaqus模拟中水力裂缝与天然裂缝相交的cohesive行为

abaqus 水力裂缝与天然裂缝相交 cohesive在Abaqus中模拟水力裂缝与天然裂缝相交的过程,尤其是涉及到cohesive单元时,确实是一个挺有意思的挑战。我们不仅要考虑裂缝的扩展,还得处理它们之间的相互作用。今天咱们就来聊聊这个,顺便…

2026/5/17 12:16:59 阅读更多 →

最新新闻

微信小程序反编译终极指南:用unveilr快速提取小程序源码

微信小程序反编译终极指南:用unveilr快速提取小程序源码

微信小程序反编译终极指南:用unveilr快速提取小程序源码 【免费下载链接】unveilr-v2.0.0 小程序反编译工具 项目地址: https://gitcode.com/gh_mirrors/un/unveilr-v2.0.0 你是否曾经想要深入了解优秀小程序的实现细节,却苦于无法查看其源码&…

2026/7/8 12:09:38 阅读更多 →
Fortify 扫描 Mass Assignment 漏洞:5步修复与 Jackson 注解实战

Fortify 扫描 Mass Assignment 漏洞:5步修复与 Jackson 注解实战

Fortify 扫描 Mass Assignment 漏洞:5步修复与 Jackson 注解实战当 Fortify 扫描报告中出现 "Mass Assignment: Insecure Binder Configuration" 警告时,Java 开发者需要立即采取行动。这种漏洞允许攻击者通过 HTTP 请求修改对象中本应受保护的…

2026/7/8 12:09:38 阅读更多 →
ARIMA(p,d,q) 模型实战:Python statsmodels 0.14 实现销售预测,MAPE 降至 5% 以下

ARIMA(p,d,q) 模型实战:Python statsmodels 0.14 实现销售预测,MAPE 降至 5% 以下

ARIMA(p,d,q) 模型实战:Python statsmodels 实现高精度销售预测在商业决策中,准确预测未来销售趋势是企业制定库存计划、优化营销策略和资源配置的关键。传统的时间序列预测方法往往难以捕捉数据中的复杂模式,而ARIMA模型作为一种经典的预测工…

2026/7/8 12:07:34 阅读更多 →
Claude Code 适合哪些开发者?新人、全栈还是架构师?

Claude Code 适合哪些开发者?新人、全栈还是架构师?

摘要:Claude Code 不是"人人必装"的工具。这篇给出一份人群适配地图——9 种开发者角色,分别能从中得到什么、需要注意什么、适不适合投入时间学。你会在这张地图上找到自己的位置。 适用读者:正在犹豫"这东西适合我吗&#x…

2026/7/8 12:05:33 阅读更多 →
如何批量整理与归类用户评论和反馈?从乱序数据到产品洞察的实战攻略

如何批量整理与归类用户评论和反馈?从乱序数据到产品洞察的实战攻略

运营人员每天都要面对成千上万条散落在应用商店、社群、问答社区的用户评论与反馈。怎么把这些杂乱无章的吐槽和建议,快速整理成产品迭代的可用洞察?过去靠人工表格筛选,分类 1000 条反馈需要耗费大半天,现在利用 AI模型聚合平台&…

2026/7/8 12:05:33 阅读更多 →
基于ICM-42605和PIC18F85K90的6DOF运动追踪系统设计

基于ICM-42605和PIC18F85K90的6DOF运动追踪系统设计

1. 项目背景与核心需求解析在当今的智能硬件和工业自动化领域,精确追踪物体在三维空间中的运动和方向已成为许多应用的基础需求。无论是无人机飞控系统需要实时感知自身姿态,VR设备要准确捕捉用户头部运动,还是工业机械臂需要精确定位末端执行…

2026/7/8 12:05:33 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻