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

news2024/12/29 5:29:17

分支和循环专题应用

    • 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.coloradmin.cn/o/2141119.html

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

相关文章

‌PhotoZoom Pro 9‌和‌PhotoZoom Classic 9‌都提供了多项新功能

​PhotoZoom 9是一款划时代的、技术上产生革命性影响的数码图片放大工具。该软件使用了全新的S-Spline技术&#xff08;拥有自动调节、领先的差值算法等技术及亮点&#xff09;&#xff0c; 开创了图片放大技术的新领域&#xff0c;采用更为领先的优化算法&#xff0c;对不断放…

Linux进阶命令-sedsplit

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

Renesas R7FA8D1BH (Cortex®-M85)控制ISLS29035

目录 概述 1 ISL29035芯片介绍 1.1 ISL29035特征 1.2 ISL29035工作电路 1.3 ISL29035工作时序分析 1.4 ISL29035相关的寄存器 1.4.1 COMMAND-1( 0x00 ) 1.4.2 COMMAND-11&#xff08;0x01&#xff09; 1.4.3 DATA寄存器&#xff08;0x02和0x03&#xff09; 1.4.4 中断…

2分钟解决联想电脑wifi功能消失 网络适配器错误代码56

分钟解决联想电脑wifi功能消失 网络适配器错误代码56 现象 原因 电脑装了虚拟机&#xff0c;导致网络适配器冲突。我的电脑是装了vm虚拟机&#xff0c;上次更新系统后wifi图标就消失了。 解决方案 1、先卸载虚拟机 2、键盘按winr&#xff0c;弹出运行窗口&#xff0c;输入“…

系统架构设计师 需求分析篇一

&#x1f4d8; 结构化分析SA 思想 自顶向下&#xff1a;像剥洋葱一样&#xff0c;层层深入&#xff0c;大问题拆成小问题&#xff0c;再拆成更小的问题。 核心模型 数据字典 &#x1f4d4;&#xff1a;记录数据元素的点点滴滴&#xff0c;从属性到使用方式&#xff0c;无所…

QUIC的丢包处理

QUIC的重试数据包&#xff08;Retry Packet&#xff09;为什么会触发重启另一个连接 安全性考量 防止重放攻击 重试数据包&#xff08;Retry Packet&#xff09;是在初始握手过程中由服务端发送给客户端&#xff0c;用于验证客户端的IP地址&#xff0c;以防止重放攻击。 在一…

STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)

在研究声音、电力或任何形式的波形时&#xff0c;我们常常需要穿过表面看本质。FFT&#xff08;快速傅里叶变换&#xff09;就是这样一种强大的工具&#xff0c;它能够揭示隐藏在复杂信号背后的频率成分。本文将带你走进FFT的世界&#xff0c;了解它是如何将时域信号转化为频域…

【Android】【Compose】实现列表数据添加

序言 在使用列表的时候&#xff0c;以前是使用 Layout 布局里面添加Recyclerview进行列表的显示&#xff0c;但是在Compose里面&#xff0c;是没有这个Recyclerview使用的&#xff0c;那Compose怎么实现列表数据呢&#xff1f; 使用 【LazyColumn】 首先创建一个Compose项目…

java,深拷贝和浅拷贝

在 Java 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是对象拷贝的两种方式&#xff0c;主要区别在于它们如何处理对象的内部引用。 目录 一、浅拷贝&#xff08;Shallow Copy&#xff09; 实现方式 二、深拷贝&…

国际商城系统怎么弄 跨境电商商城怎样上线

国际商城系统一般涉及多个关键步骤。首先&#xff0c;需要选择合适的平台或开发工具&#xff0c;如商淘云国际电商系统或自定义开发。其次&#xff0c;系统应支持多语言、多币种以及国际支付网关&#xff0c;以满足全球客户的需求。第三&#xff0c;确保系统具有强大的物流和配…

推荐5款AI论文大纲生成器,一键极速生成!

在当今学术研究和写作领域&#xff0c;AI论文大纲生成器的出现极大地提高了写作效率和质量。以下是五款功能强大且全面的AI论文大纲生成器推荐&#xff1a; 一、千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和自然语言处理技术的AI写作助手&#xff0c;旨在帮助用户…

新160个crackme - 058-CZG-crackme1

运行分析 按下OK键后&#xff0c;程序退出 PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida函数栏发现winMain(x,x,x,x)&#xff0c;即打开窗口&#xff0c;双击函数跟进 继续跟进 双击DialogFunc函数&#xff0c;这个是窗口逻辑 继续跟进sub_401090函…

数据结构----栈和队列

&#xff08;一&#xff09;栈 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First …

GFS 分布式文件系统 GlusterFS

一、GlusterFS概述 1.1、GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 包括其去中心化&#xff08;无元数据服务器&#xff09;的特性&#xff0c;这有…

【苍穹外卖】总结

1 pom 依赖 1.1 MyBatis Spring 用于简化 MyBatis 与 Spring Boot 的集成&#xff0c;提供了对 MyBatis 框架的自动配置支持&#xff0c;简化了数据访问层的开发 1.2 Lombok Lombok 是一个 Java 库&#xff0c;能够通过注解自动生成常见的代码&#xff08;如 getter、setter、…

双亲委派机制知识点

类加载器 双亲委派模型 为什么采用双亲委派模型 打破双亲委派机制的场景 Tomcat 打破双亲委派机制:目的是可以加载不同版本的jar包 实现类隔离&#xff1a;在Tomcat中&#xff0c;每个Web应用使用独立的类加载器加载类文件&#xff0c;这样做的好处在于&#xff0c;当在同一T…

C++二叉搜索树(二叉树进阶)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C二叉搜索树(二叉树进阶) 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 二叉搜索树…

Java重修笔记 第五十七天 坦克大战(七)多线程基础 - 编程练习

1. 线程之间的协调控制&#xff08;通知方式&#xff09; public class Homework04 {public static void main(String[] args) {// 在 main 方法中启动两个线程// 第一个线程内循环打印 1 到 100 以内的整数// 直到第二个线程从键盘读取到 "Q" 指令后结束第一个线程…

Porcupine - 语音关键词唤醒引擎

文章目录 一、关于 Porcupine特点用例尝试一下 语言支持性能 二、Demo1、Python Demo2、iOS DemoBackgroundService DemoForegroundApp Demo 3、网页 Demo3.1 Vanilla JavaScript 和 HTML3.2 Vue Demos 三、SDK - Python 一、关于 Porcupine Porcupine 是一个高度准确和轻量级…

LC并联电路在正弦稳态下的传递函数推导(LC并联谐振选频电路)

LC并联电路在正弦稳态下的传递函数推导&#xff08;LC并联谐振选频电路&#xff09; 本文通过 1.解微分方程、2.阻抗模型两种方法推导 LC 并联选频电路在正弦稳态条件下的传递函数&#xff0c;并通过仿真验证不同频率时 vo(t) 与 vi(t) 的幅值相角的关系。 电路介绍 已知条件…