C++代码入门07 函数调用语句

 

图源:文心一言

听课笔记简单整理,包括以下内容”🐋3.2 二进制转十进制、🐋3.3 数学公式1:用反切函数表示pi、🐋3.4 判断回文数、🐋3.5 数学公式2:分段函数、🐋3.6 扔骰子“供小伙伴们参考~🥝🥝

  • 第1版:听课的记录代码~🧩🧩

编辑:梅头脑🌸

审核:文心一言


目录

🐳课程来源

🐳函数调用

🐋3.2 二进制转十进制

🐋3.3 数学公式1:用反切函数表示pi

🐋3.4 判断回文数

🐋3.5 数学公式2:分段函数

🐋3.6 扔骰子

🔚结语


🐳课程来源

  • 郑莉老师的公开课:🌸C++语言程序设计基础 - 清华大学 - 学堂在线 (xuetangx.com)

备注:本章中的sin()、arctan()、power()在C++库中均可以直接调用,为了练习,老师要求这些函数均为手打。 

🐳函数调用

🐋3.2 二进制转十进制

📇算法思路

  • 输入8位二进制数,每位数字乘以其权值相加(在本栗中,这个功能由函数power完成),即为十进制;
  • 举栗:01101001为二进制,转十进制的算式:0 x 2^7 + 1 x 2^6 + 1 x 2^5 + 0 x 2^4 + 1 x 2^3 + 0 x 2^2 + 0 x 2^1 + 1 x 2^0 = 64 + 32 + 8 + 1 = 105;

⌨️算法代码

#include <iostream>
using namespace std;

double power(double x, int n) {
	double val = 1.0;
	while (n--)
		val *= x;
	return val;
}

int main() {	// 功能:二进制转十进制
	int value = 0;
	cout << "Enter an 8 bit binary number: ";		// 输入8位二进制数,如01101001
	for (int i = 7; i >= 0; i--) {
		char ch;
		cin >> ch;
		if (ch == '1')								// 如果位数是1
			value += static_cast<int>(pow(2, i));	// 乘以权重,即2的i次方,其结果转化位Int,并累加至value
	}
	cout << "Decimal value is " << value << endl;
	return 0;
}

🐋3.3 数学公式1:用反切函数表示pi

🧩题目

📇算法思路

  • arctan(x)重复出现,在本题按照泰勒展开式,可以单独写为被调用的函数;
  • 在main()函数中调用arctan(x),实现计算公式;

⌨️算法代码

#include <iostream>
using namespace std;

// arctan x = x - x^3/3 + x^5/5 - x^7/7 + ...
double arctan(double x) {
    double sqr = x * x;                     // 幂次公差项
    double e = x;                           // 幂次初始项
    double r = 0;                           // 计算结果
    int i = 1;                              // 常数项
    while (e / i > 1e-15) {                 // 精度要求:e / i > 10^-15时,结束循环
        double f = e / i;                   // x / 1,x^3 / 3,x^5 / 5…
        r = (i % 4 == 1) ? r + f : r - f;   // 根据公式,x、x^5、x^9…项为正,x^3、x^7、x^11…为负
        e = e * sqr;                        // x → x^3 → x^5 …
        i += 2;
    }
    return r;
}

int main()
{
    double a = 16.0 * arctan(1 / 5.0);
    double b = 4.0 * arctan(1 / 239.0);
    // 注意:因为整数相除结果取整,如果参数写1/5,1/239,结果都是0;

    // pi = 16*arctan(1/5) - 4*arctan(1/239),运行结果:3.14159
    cout << "PI = " << a - b << endl;   
    return 0;
}

📇备注小事

    double a = 16.0 * arctan(1 / 5.0);
    double b = 4.0 * arctan(1 / 239.0);

  • 因为整数相除结果取整,如果参数写1/5,1/239,结果都是0(整型相除,电脑会自动舍去小数点位);
  • 对于浮点数,电脑可能没办法精确的表示,因此判断相等的方式与整数有所区别,可能不会使用“ == ”,而是两数相减,低于1个非常小的阈值则判定相等,相关练习题可参考:🌸;

🐋3.4 判断回文数

🧩题目

📇算法思路

  • 回文的判断,可以单独写为被调用的函数;
  • 在主函数中判断是否 m、m^2、m^3同时满足条件;

⌨️算法代码

#include <iostream>
using namespace std;

// 反转数字n,判断是否为回文
bool symm(unsigned n) {
    unsigned i = n;
    unsigned m = 0;
    while (i > 0) {
        m = m * 10 + i % 10;    // 将i现在的个位数 乘以 权值,加到m(也可以理解为,将i的最低位 添加到 m的最高位)
        i /= 10;                // 去掉i现在的最低位
    }
    return m == n;
}

int main()
{
    for (unsigned m = 11; m < 1000; m++) 
        if (symm(m) && symm(m * m) && symm(m * m * m)) {    // 如果m,m^2,m^3均为回文
            cout << "m = " << m;
            cout << " m * m = " << m * m;
            cout << " m * m * m = " << m * m * m << endl;
        }
    return 0;
}

🐋3.5 数学公式2:分段函数

🧩题目

📇算法思路

  • sin(x)重复出现,在本题按照泰勒展开式,可以单独写为被调用的函数;
  • main()函数中调用sin(x),使用if、else语句实现分段函数;

⌨️算法代码

#include <iostream>
#include <cmath>                    // 对标准库中数学函数的说明
using namespace std;

const double TINY_VALUE = 1e-10;    // 计算精度为10^-10

double tsin(double x) {     // sin x = x/(1!) - x^3/(3!) + x^5/(5!)  …
    double g = 0;           // 计算结果
    double t = x;           // x 起始项
    int n = 1;              // 常数 起始项
    do {
        g += t;
        n++;
        t = -t * x * x / (2 * n - 1) / (2 * n - 2);     // 计算每一个展开项
    } while (fabs(t) >= TINY_VALUE);                    // t的绝对值 > 精度时,继续循环
    return g;
}

int main()
{
    double k, r, s;
    cout << "r = ";
    cin >> r;
    cout << "s = ";
    cin >> s;
    if (r * r <= s * s)
        k = sqrt(tsin(r) * tsin(r) + tsin(s) * tsin(s));
    else
        k = tsin(r * s) / 2;
    cout << k << endl;
    return 0;
}

🐋3.6 扔骰子

🧩题目

📇算法思路

  • 难点1:产生随机数,这个可以用C++自带的srand()产生;
  • 难点2:游戏规则判定输赢,使用条件判断switch + 枚举类型enum解决;

⌨️算法代码

#include <iostream>  
#include <cstdlib>  
#include <ctime>  
using namespace std;

// 枚举游戏状态:胜利、失败、继续游戏
enum GameStatus { WIN, LOSE, PLAYING }; 

// 投掷一个六面骰子两次
int rollDice() {
    int die1 = 1 + rand() % 6;
    int die2 = 1 + rand() % 6;
    int sum = die1 + die2;
    cout << "player rolled " << die1 << " + " << die2 << " = " << sum << endl;
    return sum; 
}

int main()
{
    int sum, mypoint;
    GameStatus status;
    unsigned seed;
    cout << "Please enter an unsigned integer for seed:";
    cin >> seed; // 输入随机数种子  
    srand(seed); // 将种子传递给rand()  

    sum = rollDice();   // 第一轮投骰子,计算和数  
    switch (sum) {
    case 7:
    case 11:
        status = WIN;   // 如果和数为7或11则为胜,状态为WIN  
        break;
    case 2:
    case 3:
    case 12:
        status = LOSE;  // 如果和数为2、3或12则为负,状态为LOSE  
        break;
    default:            // 其它情况,尚无结果,状态为PLAYING,记下点数  
        status = PLAYING;
        mypoint = sum;  // 求和,输出,记录为接下来胜利的点数mypoint
        cout << "point is " << mypoint << endl;
        break;
    }

    while (status == PLAYING) { // 只要状态为PLAYING,继续游戏  
        cout << "Rolling the dice again..." << endl;
        sum = rollDice();       // 每次投掷两次骰子  
        cout << "The sum is " << sum << endl;
        if (sum == mypoint)     // 某轮的和数等于点数mypoint则取胜  
            status = WIN;
        else if (sum == 7)      // 出现和数为7则为负  
            status = LOSE;
    }

    // 当状态不为PLAYING时循环结束,输出游戏结果  
    if (status == WIN)
        cout << "Player wins!" << endl;
    else
        cout << "Player loses." << endl;

    return 0;
}

📇知识扩展

rand()srand()

  • rand()可以产生随机数,但是rand()产生的是伪随机数,就是扔1次以后是这个序列,再扔1次以后还是这个序列;
  • 为了避免总是用相同的序列产生随机值,通常的方法,我们会给随机数加1个种子,不同的种子会产生不同的随机数序列,初始时使用户输入,即为srand();还有一种随机的方法,可以使用当前时间使用当前时间(time(NULL))作为种子产生随机值:
#include <stdlib.h>  
#include <time.h>  

int main() {  
    srand(time(NULL)); // 使用当前时间作为种子  
    // ... 生成随机数  
    return 0;  
}

🔚结语

博文到此结束,写得模糊或者有误之处,期待小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶‍🌫️😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟

同系列的博文:🌸数据结构_梅头脑_的博客-CSDN博客

同博主的博文:🌸随笔03 笔记整理-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

容器安全工具

容器安全工具是用于保护和监控容器环境安全的工具。它们提供了一系列功能,包括容器镜像的漏洞扫描、运行时监控、事件日志记录、访问控制、运行权限管理等。以下是一些常见的容器安全工具: 1. Docker Bench Security:用于检查Docker环境配置的安全性,提供一些最佳实践建议…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM平台编程第二天-ARM汇编(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1bG0tuVaACATvjLwD05j1FQ?pwd1688 提取码&#xff1a;1688 上午&#xff1a;ARM编程模型 下午&#xff1a;常用ARM指令 教学内容&#xff1a; 1、ARM数据类型 字节&#xff08;Byte&#xff09;&#xff1a;在ARM体系结构及常见的…

无限可能!安全狗入选“潜力十强企业”

近日&#xff0c;等级保护测评公布了“2023年网络安全优秀评选”活动评选结果。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借突出的综合实力&#xff0c;荣获“潜力十强企业”称号。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;创办于…

redis-发布缓存

一.redis的发布订阅 什么 是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可…

信创UOS

信创UOS 国产操作系统 文章目录 信创UOS前言一、信创UOS是什么二、信创UOS的特点与局限性1. 信创UOS的特点2. 信创UOS的局限性三、信创UOS常见故障总结前言 信创UOS(Union Operating System)是由中国软件与技术服务股份有限公司(CS&S)开发的一款操作系统。它是中国政府…

SpringCloudFunction漏洞分析

前言 SpringCloudFunction是SpringBoot开发的一个Servless中间件&#xff08;FAAS&#xff09;&#xff0c;支持基于SpEL的函数式动态路由。在特定配置下&#xff0c;3 < 版本 < 3.2.2&#xff08; commit dc5128b 之前&#xff09;存在SpEL表达式执行导致的RCE。 补丁分…

卸载软件Geek Uninstaller,MySQl安装不成功

最近刷最右的时候&#xff0c;看到两个帖子都是MySQl安装过程总是出现问题。大概两年前我也遇到了这个问题&#xff0c;推荐一款软件。 是因为在安装的过程之中&#xff0c;出现了问题。然后你再进行安装的时候&#xff0c;没有完全将原来安装的软件卸载掉&#xff0c;导致有注…

详解SpringCloud微服务技术栈:ElasticSearch实践1——RestClient操作索引库与文档

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;ElasticSearch原理精讲、安装、实践 &#x1f4da;订阅专栏&#xff1a;微服务技术全家…

多场景建模:阿里MARIA

Multi-scenario ranking framework with adaptmulti-scenario ranking framework with adaptive feature learning 背景 多模态搜索场景支持用户通过不同模态的Query来表达多样的搜索需求。 拍照搜索&#xff08;Visual Search&#xff09;&#xff1a;实拍图作为query相似商…

05.Elasticsearch应用(五)

Elasticsearch应用&#xff08;五&#xff09; 1.Mapping介绍 Mapping是对索引库中文档的约束&#xff0c;类似于数据表结构&#xff0c;作用如下&#xff1a; 定义索引中的字段的名称定义字段的数据类型&#xff0c;例如字符串&#xff0c;数字&#xff0c;布尔等字段&…

antdesignvue中使用VNode写法

1、使用场景 如图&#xff1a;消息提示框中&#xff0c;将数据中的数据单独一行显示 2、代码 let errorList res.result; //后端返回的数据例&#xff1a; ["1. 数据格式不正确","2. 数据已存在"]if(errorList&&errorList.length!0){this.$notif…

IDE server has started, listening on http://127.0.0.1:61945已解决

看了网上很多网上博主写的&#xff0c;总结出来了两个主要方法&#xff0c;以我的为准&#xff0c;很多博客都是错误的&#xff01; 1.打开微信开发者工具的安全权限 设置-安全设置-服务端口 2.必须把appid改为自己的才能打开微信小程序&#xff0c;只能在mainfest里面改&…

【工具使用-Everything】everything只能搜到文件夹,无法搜到文件

一&#xff0c;问题现象 everything搜索时&#xff0c;只能搜索到文件夹&#xff0c;无法搜索到文件夹下的文件。 二&#xff0c;问题原因 everything搜索设置问题&#xff0c;设置为"文件夹"导致 三&#xff0c;解决方法 将搜索选项设置为“所有”即可&#x…

第3章 接口和API设计

第15条&#xff1a;用前缀避免命名空间冲突 OC没有其他语言那种内置的命名空间机制。因此&#xff0c;我们在起名时要设法避免潜在的命名冲突&#xff0c;否则很容易就重名了。若是发生重名冲突&#xff0c;那么应用程序相应的链接过程就会出错。例如&#xff1a; 错误原因在…

ORBSLAM3 运行流程,以rgbd_tum.cc函数为例进行分析

一、运行 使用的是D435i相机自己录制的数据。 运行命令&#xff1a; ./Examples/RGB-D/rgbd_tum /opt/vslam/ORB_SLAM3_detailed_comments-dense_map_new/Vocabulary/ORBvoc.txt /opt/vslam/ORB_SLAM3_detailed_comments-dense_map_new/Examples/RGB-D/TUM1.yaml /opt/vsl…

Modern C++ std::bind的实现原理

1. 前言 前面写过《std::function从实践到原理》&#xff0c;管中规豹了std::function的一点点原理&#xff0c;不过还有一个与std::function密切相关的函数std::bind, 允许编程者绑定几个参数&#xff0c;本文着重介绍它的实现原理。不介绍一下它&#xff0c;有点吃肉不吃蒜味…

【C++干货基地】C++入门篇:输入输出流 | 缺省函数 | 函数重载(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

JVM-初始JVM

什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; JVM的功能 1 - 解释和运行 2 - 内存管理 3 - 即时编译 解释和运行 解释…

如何配置Tomcat服务环境并实现无公网ip访问本地站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

重塑网络安全格局:零信任安全架构的崛起与革新

零信任安全架构是一种现代安全模式&#xff0c;其设计原则是“绝不信任&#xff0c;始终验证”。它要求所有设备和用户&#xff0c;无论他们是在组织网络内部还是外部&#xff0c;都必须经过身份验证、授权和定期验证&#xff0c;才能被授予访问权限。简而言之&#xff0c;“零…