【C语言】分支和循环专题应用

分支和循环专题应用

    • 1、随机数生成
      • 1.1rand
      • 1.2 srand函数介绍
      • 1.3 time函数介绍
      • 1.4 设置随机数的范围
    • 2、猜数字游戏的代码及实现

通过了分支和循环的介绍学习之后,我们可以运用分支和循环语句写出一些有趣的代码了,让我们来一起探索吧!

写一个猜数字游戏
游戏要求:

  • 电脑自动生成1-100的随机数
  • 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或者小了的反馈,直到猜对,游戏结束。

1、随机数生成

1.1rand

C语言提供一个rand的函数,这个函数可以生成随机数,函数的结构如下:

int rand(void);

rand函数会返回一个伪随机数,这个随机数的范围是在0-RAND_MAX之间,这个RAND_MAX的大小是依赖编译器实现的,大部分的编译器显示的数值为32767。

rand函数的使用需要包含一个头文件:<stdlib.h>
下面我们通过代码来测试一下rand函数,这里多次调用几次rand函数,产生6个随机数:

在这里插入图片描述

在这里插入图片描述
多次运行得到的随机数都和第一次得到的结果是一样的,这是为什么呢?

深入了解后,我们发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。而rand函数是对一个叫做“种子”的基准值进行运算生成的随机数。

之所以前面每次运行程序产生的随机数序列是一样的,是因为rand函数生成随机数的默认种子是1.如果要生成不同的随机数,就要让种子是变化的。

1.2 srand函数介绍

C语言中又提供了一个srand函数,用来初始化随机数生成器的,srand的语法如下:

void srand (unsigned int seed);

程序在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。

简言之,就是srand种子如果是随机的,rand就能生成随机数,在生成随机数的时候又需要一个随机数,这样就显得矛盾了。

1.3 time函数介绍

在程序中我们一般使用程序运行的时间作为种子,这是因为时间时刻随时在发生变化,得到的种子也是不同的。

C语言中提供了一个time函数,就可以获得这个时间,time函数的语法如下:

time_t time (time_t* timer);

time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是s,返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。

time函数的参数timer如果是非NULL的指针的时候,函数也会将这个返回的差值放在timer指向的内存中带回去。

如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。

time函数需要包含的头文件为:time.h

如果只是让time函数返回时间戳,可以按照如下代码写:

time(NULL);

在这里插入图片描述

有了time函数的知识做铺垫,我们就可以改写一下之前随机数的代码:

在这里插入图片描述
在这里插入图片描述
注意:srand函数是不需要频繁调用的,一次运行的程序中调用一次就够了。

1.4 设置随机数的范围

如果我们要生成0-99之间的随机数,方法如下:

rand()%100;//余数的范围是0-99

如果要生成1-100的随机数,方法如下:

rand()%100+1;

如果要生成100-200的随机数,方法如下:

rand()%(200-100+1)+100;

以此类推,如果要生成a-b的随机数,方法如下:

a+rand()%(b-a+1);

2、猜数字游戏的代码及实现

有了上面知识的铺垫,我们就可以通过运用这些知识来写出猜数字游戏的代码了。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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;}}}void menu()
{printf("********************\n");printf("******1.play********\n");printf("******0.exit********\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("选择错误,重新选择\n");break;}} while (input);return 0;
}

在这里插入图片描述
如果需要限制猜数字次数,我们还可以这么写:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{int r = rand() % 100 + 1;int guess = 0;int count = 5;while (count){printf("您还有%d次机会\n", count);printf("请开始猜数字>:");scanf("%d", &guess);if (guess < r){printf("猜小了\n");}else if (guess > r){printf("猜大了\n");}else{printf("恭喜您,猜对了\n");break;}count--;}if (count == 0){printf("很抱歉,次数已用完,游戏结束,正确的值是%d\n",r);}}void menu()
{printf("********************\n");printf("******1.play********\n");printf("******0.exit********\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("选择错误,重新选择\n");break;}} while (input);return 0;
}

在这里插入图片描述
完结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js 中的进程和线程工作原理

本文所有的代码均基于 node.js 14 LTS 版本分析 概念 进程是对正在运行中的程序的一个抽象&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;操作系统的其他所有内容都是围绕着进程展开的 线程是操作系统能够进行运算调度的最小单位&#xff0c;其是进程中的一个执…

文献多\bibliographystyle和文献少\begin{thebibliography}

\bibliographystyle 和 \begin{thebibliography} 是 LaTeX 中用于处理文献引用的两种不同方法。它们各自有不同的用法和适用场景&#xff1a; 1. \bibliographystyle 和 \bibliography 这种方法是利用 BibTeX 来管理参考文献数据。通常在文献量大、格式要求严格的情况下使用。…

ARM/Linux嵌入式面经(三四):CVTE

文章目录 1、C++单例模式回答 C++ 单例模式问题2、虚函数、纯虚函数虚函数(Virtual Functions)纯虚函数(Pure Virtual Functions)虚函数与纯虚函数的主要区别面试官可能的追问3、堆和栈区别回答堆和栈的区别面试官可能的追问怎么判断栈的大小?方法?1. **编译器和链接器设…

远程桌面内网穿透是什么?有什么作用?

远程桌面内网穿透指的是通过特定技术手段&#xff0c;将处于内网中的电脑或服务器&#xff0c;通过外部网络&#xff08;互联网&#xff09;进行访问。内网穿透的主要作用是解决在内网环境下&#xff0c;远程设备与外部互联网之间的连接问题&#xff0c;允许用户从外部访问内网…

.Net Gacutil工具(全局程序集缓存工具)使用教程

GAC介绍&#xff1a; GAC&#xff08;Global Assembly Cache&#xff09;全局程序集缓存&#xff0c;是用于存放.Net应用程序共享的程序集。 像平常我们在Visual Studio中引用系统程序集时&#xff0c;这些程序集便来自于GAC。 GAC默认位置为&#xff1a;%windir%\Microsoft…

JavaScript中的export、export default、exports和module.exports(export、export default、exports使用详细)

简介: 在JavaScript中&#xff0c;export 和 export default 是 ES6 模块系统的核心部分&#xff0c;用于从文件中导出函数、关键字&#xff0c;对象或值&#xff0c;使其可以在其他文件中通过 import 语句导入和使用&#xff0c;而 exports和 module.exports 是CommonJS模块系…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…

安全通信网络等保

通用要求 1.网络架构 1)应保证网络设备的业务处理能力满足业务高峰期需要。 设备CPU和内存使用率的峰值不大于设备处理能力的70%。 在有监控环境的条件下,应通过监控平台查看主要设备在业务高峰期的资源(CPU、内存等)使用 情况;在无监控环境的情况下,在业务高峰期登录…

基于对数变换的图像美白增强,Matlab实现

博主简介&#xff1a;matlab图像处理&#xff08;QQ:3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于对数变换的图像美白增强&#xff0c;用matlab实现。 一、案例背景和算法介绍 这次案例是美白算法&…

在实际LabVIEW开发中,哪些算法是常用的?

在LabVIEW的实际开发中&#xff0c;常用的算法主要集中在数据处理、控制系统、信号处理、图像处理等领域。以下是一些常用算法的介绍&#xff1a; 1. PID控制算法 PID&#xff08;比例-积分-微分&#xff09;控制是LabVIEW中常用的算法之一&#xff0c;广泛应用于工业自动化和…

剃(磨)前插齿刀设计计算开发第一步

之前接触滚刀比较多&#xff0c;渐开线齿轮滚刀的基准齿形的参数相对简单&#xff0c;都是由直线和圆弧组成的。插齿刀实质是一个开了前角后后角的“特殊齿轮”&#xff0c;在齿轮的齿形上增加“凸角”和“倒角”相对滚刀基准齿形就要复杂一些了&#xff1a; 要设计一款剃&…

深入分析计算机网络性能指标

速率带宽吞吐量时延时延带宽积往返时间RTT利用率丢包率图书推荐内容简介作者简介 速率 连接在计算机网络上的主机在数字信道上传送比特的速率&#xff0c;也称为比特率或数据率。 基本单位&#xff1a;bit/s&#xff08;b/s、bps&#xff09; 常用单位&#xff1a;kb/s&#x…

UVM仿真的运行(四)—— objection 机制

0. 引言 前面介绍了uvm仿真的启动,按照domain中指定的DAG的phase node 顺序执行各个组件的phase。 在执行run_phase node的Executing 状态时,以fork...join_none的方式在后台调用run_phase imp的traverse方法去并行执行各个component的run_phase方法,同时会等待task运行结…

MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码

安装xcode&#xff0c; cmake&#xff0c; ninja brew install node mac下安装OpenGL库并使之对各项目可见 在macOS上安装OpenGL通常涉及到安装一些依赖库&#xff0c;如MGL、GLUT或者是GLEW等&#xff0c;同时确保LLVM的OpenGL框架和相关工具链的兼容性。以下是一个基本的安装…

【算法】动态规划—编辑距离

题目 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 思路分析 编辑距离问题就是给定两个字符串 s1 和 s2&#xff0c;只能用三种操作…

【隐私计算】Paillier半同态加密算法

一、何为同态加密&#xff08;HE&#xff09;&#xff1f; HE是一种特殊的加密方法&#xff0c;它允许直接对加密数据执行计算&#xff0c;如加法和乘法&#xff0c;而计算过程不会泄露原文的任何信息。计算的结果仍然是加密的&#xff0c;拥有密钥的用户对处理过的密文数据进…

C#笔记13 线程同步概念及其实现,详解lock,Monitor,Mutex代码用法

同步的概念 在我们学会在C#中使用线程之后&#xff0c;我们拥有了把一个程序中的不同代码段在不同线程中运行的能力&#xff0c;可以说此时我们已经能够做到让他们分别执行&#xff0c;异步执行。 对于我们的桌面端程序&#xff0c;使用多线程可以让我们在后台进行操作的时候…

编程辅助工具下一个热门应用场景是什么?(一)

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

QT之QML学习五:添加自定义Qml组件,以及组件管理

开发环境: 1、Qt 6.7.2 2、Pyside6 3、Python 3.11.4 4、Windows 10 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!!…

6.1 溪降技术:绳结

目录 6.1 绳结电子书&#xff1a;绳结1级概览正确打结打绳结绳结组成部分学习术语八字套结&#xff08;双八字结&#xff09;观看技术步骤双重单结&#xff08;反手结绳耳&#xff09;观看技术步骤骡子结&#xff08;驮马结&#xff09;观看技术步骤 6.1 绳结 电子书&#xff1…