C++面向对象程序设计 - 函数库

embedded/2024/10/18 19:25:03/

        C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C++从C语言继承了些函数功能。如果要用函数库中的函数,就必须在程序文件中包含文件中有关的头文件,在不同的头文件中,包含了不同的函数的声明。

        在C语言的传统方法中,头文件名包括后缀.h,如stdio.h,math.h等。由于C语言没有命名空间,头文件并不存放在命名空间中,因此在C++程序文件中如果用到带后缀.h的头文件时,不必用命名空间,只需在文件中包含所用的头文件即可。代码示例如下:

#include <math.h>

        在C++的新方法,系统提供的头文件不包括后缀.h,如iostream,string等。为了表示与C语言的头文件有联系又有区别,C++所用的头文件名在C语言的相应的头文件名之前加一个字母c。例如C语言中有关输入输出的头文件名为stdio.h在C++中相应头文件名为cstdio。C语言的头文件string.h在C++的头文件名为cstring。代码示例如下:

#include <cstdio>
#include <cmath>
using namesapce std;

一、cstdio

        在C++中,cstdio是一个标准头文件,它包含了标准库中的I/O(输入/输出)函数。这个头文件实际上是C语言标准库<stdio.h>的C++封装,其中的函数可以直接在C++代码中使用,但为了保持与C的兼容性,并且为了避免在C++的全局命名空间引入名称冲突,C++使用了不带.h后缀的头文件,并且在它们前面添加了c前缀。

        在C++程序开发中,虽然推荐使用C++自己的I/O流库(如iostream),但在某些情况下使用cstdio还是有必要的,诸如printf()、scanf()等函数。

1.1 scanf()函数格式字符串

转换说明符数据类型
%c字符
%d整数
%f浮点数
%lf双精度浮点数
%s字符串,以空格分隔

示例如下:

#include <cstdio>int main(){// 使用printf函数输出控制台printf("Hello world!\n");char input[100];// 使用scanf函数从控制台读取一个字符串printf("Enter a string:");scanf("%s", input);// 使用printf函数输出读取的字符串printf("You entered: %s\n", input);return 0;
}

        运行后结果如下图:

1.2 指定缓冲区长度        

        为了防止缓冲区溢出,该函数还可以指定输入字符的最大长度,代码如下:

#include <cstdio>int main(){char input[100];// 使用scanf函数从控制台读取一个字符串printf("Enter a string:");scanf("%3s", input);// 使用printf函数输出读取的字符串printf("You entered: %s\n", input);return 0;
}

        只要在%号和s字符之间指定缓冲区长度即可,运行后输入Hello只能输出指定长度的字符串,如下图:

1.3 输出字符串包含空格

        在前面的示例中,当遇到空格后就结束了,这是因为scanf函数不会自动处理空格作为字符串一部分,怎么样包含空格连着输出一个完整的字符串信息呢。这时需要作此特殊处理,使用%[^\n]说明符告诉scanf函数读取输入直到遇到换行符为止,这样就能包含空格了。

        %[]格式说明符用于读取指定字符集的字符,&\n表示读取直到遇到换行符为止。示例代码如下:

#include <cstdio>int main(){char input[100];// 使用scanf函数从控制台读取一个字符串printf("Enter a string:");scanf("%[^\n]", input);// 使用printf函数输出读取的字符串printf("You entered: %s\n", input);return 0;
}

        运行后结果如下图:

        当然,这里也可以指定缓冲区大小,代码示例如下:

#include <cstdio>int main(){char input[100];// 使用scanf函数从控制台读取一个字符串printf("Enter a string:");scanf("%8[^\n]", input);// 使用printf函数输出读取的字符串printf("You entered: %s\n", input);return 0;
}

        当指定缓冲区大小为8时,hello有5个字符,空格+wo为3个字符,刚好输出8个字符结束。结果如下图:

二、cmath

        在C++中,<cmath>是一个标准的头文件,它提供了许多用于数学运算的函数和宏。这些函数通常用于处理浮点数和整数型的数学运算,包括三角函数、双曲函数、指数函数、对数函数、幂函数、取整函数等。

        以下为常见的函数:

2.1 三角函数

函数说明
sin(x)正弦函数
cos(x)余弦函数
tan(x)正切函数
asin(x)反正弦函数(返回弧度)
acos(x)反余弦函数(返回弧度)
atan(x)反正切函数(返回弧度)
atan2(y, x)四象限反下切函数(返回弧度)

2.2 双曲函数

函数说明
sinh(x)双曲正弦函数
cosh(x)双曲余弦函数
tanh(x)双曲正切函数

2.3 指数和对数函数

函数说明
exp(x)e的x次幂
log(x)自然对数(以e为底)
log10(x)以10为底的对数
pow(x,y)x的y次幂

2.4 取整函数

函数说明
ceil(x)不小于x的最小整数(向上取整)
floor(x)不大于x的最大整数(向下取整)
round(x)最接近x的整数(四舍五入)
trunc(x)x的整数部分(截断小数部分)

2.5 其他函数

函数说明
sqrt(x)x的平方根
fabs(x)x的绝对值
ldexp(x, exp)计算x*(2^exp)
frexp(x, &exp)将浮点数分解为尾数和指数
fmod(x, y)计算x除以y的余数(浮点数)

注意:<cmath>中的函数通常使用弧度作为角度的单位,而不是度。如果你使用度作为角度单位,需要先将它们转换为弧度,公式为:弧度=度*(\pi/180)。

三、解一元二次方程

       了解头文件cmath中一些常见的函数后,我们用它来解一元二次方程,ax^{2}+bx+c=0的实根,如果方程没有实根,则输出有关警告信息。

解析:求根公式为x=\frac{-b\pm \sqrt{b^{2}-4ac}}{2a},公式中的\pm符号表示解的两种可能性,即方程的两个解是相同的(当判别b^{2}-4ac=0时)或不同的(当判别b^{2}-4ac>0时)。这个公式通过直接应用,可以快速找到一元二次方程的解。

  • 当判别式b^{2}-4ac\geqslant 0时,方程有实数解。
  • 当判别b^{2}-4ac< 0时,方程无实数解,但可能有复数解。

示例代码如下:

#include <iostream>
#include <cmath>		// sqrt函数定义在cmath头文件中
using namespace std;// 函数用于求解二次方程
void solveQuadraticEquation(double a, double b, double c){// 计算判别式double dis = b * b - 4 * a * c;double r1, r2;// 检查判别式的值if(dis > 0){// 两个不同的实根r1 = (-b + sqrt(dis)) / (2*a);r2 = (-b - sqrt(dis)) / (2*a);cout <<"The equation has two different real roots " <<r1 <<" and " <<r2 <<endl;} else if(dis == 0){// 两个相同的实根r1 = r2 = -b / (2*a);cout <<"The equation has two identical real roots of " <<r1 <<endl;} else{cout <<"The equation has no real roots" <<endl;}cout <<endl;
}int main(){// 定义变量double a, b, c;do{cout <<"Please output the values of a,b,c and press enter:" <<endl;cin >>a >>b >>c;solveQuadraticEquation(a, b, c);} while(a != 0);cout <<"end" <<endl;return 0;
}

        运行后结果如下图:

        


http://www.ppmy.cn/embedded/51044.html

相关文章

18V-180V降5V500mA恒压WT5118

18V-180V降5V500mA恒压WT5118 如何实现18V-180V宽电压输入下的恒压5V 500mA输出。输入电压是波动的18V还是高达180V,WT5118都能确保输出端提供稳定的5V电压和500mA的电流。 WT5118 是一款集成了 180V 高电压 MOSFET 的 DC-DC 控制器&#xff0c;专为开关电源设计。该设备具备内…

【学习笔记】CSS

CSS 1、 基础篇 1.1、选择器 1.2、长度单位 1.3、CSS2 常用属性 1.4、盒模型 1.5、浮动 1.6、定位 position2、 CSS3 2.1、新增长度单位 2.2、新增颜色表示 2.3、新增选择器 2.4、新增盒子属性 2.5、新增背景属性 …

在敏捷项目管理中实施 Scrum 方法

在本文中&#xff0c;我将阐明敏捷项目管理中的 Scrum 流程。我将深入探讨 Scrum 方法论中不可或缺的角色。本文将全面概述敏捷开发中的 Scrum 流程。我将解释 Scrum 的核心组件&#xff0c;详细探索端到端 Scrum 流程。在本文结束时&#xff0c;您将清楚地了解 Scrum 的工作原…

专访毫末智行COO 侯军:自动驾驶,水深鱼才大

站在当下&#xff0c;回看自动驾驶赛道的各个玩家们&#xff0c;活下去的要不就是“家里有矿”&#xff0c;要不就是场景、技术降维&#xff0c;渐进式发展。但活的好的有一个共性&#xff0c;就是顺应需求&#xff0c;让技术落于产业实处。 作者|斗斗 出品|产业家 “我们认…

生产实习Day10 ---- SparkSQL介绍

文章目录 Spark SQL&#xff1a;大数据处理的新境界什么是Spark SQL&#xff1f;主要特点 DataFrame和DataSetSpark SQL的基本使用使用案例 Spark SQL函数自定义函数 窗口函数结论 Spark SQL&#xff1a;大数据处理的新境界 在大数据时代&#xff0c;高效处理和分析海量数据的…

C++中的noexcept

在C11中&#xff0c;引入了noexcept关键字&#xff0c;用于指定函数是否会抛出异常。它是C语言中处理异常安全的重要工具之一。通过明确声明哪些函数不会抛出异常&#xff0c;noexcept可以帮助优化代码性能&#xff0c;并提高程序的稳定性和可维护性。 1. 什么是noexcept&…

模板类与继承

1模板类继承普通类&#xff08;常见&#xff09; #include<iostream> using namespace std; class AA { public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1&#xff08;&#xff09;…

技术分享 | 基于 API 解析的 Python 爬虫

最近各大高校纷纷翻拍 Coincidence 抖肩舞&#xff0c;需要对这种流行现象进行数据分析。数据分析首先需要有数据&#xff0c;本文介绍了爬取 B 站相应视频的评论、弹幕、播放量、点赞数等数据的方法。爬虫有多种实现方法&#xff0c;大型的网络爬虫多基于成熟的爬虫框架&#…