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

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

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

cpp 复制代码
#include <math.h>

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

cpp 复制代码
#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 字符串,以空格分隔

示例如下:

cpp 复制代码
#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 指定缓冲区长度

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

cpp 复制代码
#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表示读取直到遇到换行符为止。示例代码如下:

cpp 复制代码
#include <cstdio>

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

运行后结果如下图:

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

cpp 复制代码
#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>中的函数通常使用弧度作为角度的单位,而不是度。如果你使用度作为角度单位,需要先将它们转换为弧度,公式为:弧度=度*(/180)。

三、解一元二次方程

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

解析:求根公式为,公式中的符号表示解的两种可能性,即方程的两个解是相同的(当判别时)或不同的(当判别时)。这个公式通过直接应用,可以快速找到一元二次方程的解。

  • 当判别式时,方程有实数解。
  • 当判别时,方程无实数解,但可能有复数解。

示例代码如下:

cpp 复制代码
#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;
}

运行后结果如下图:

相关推荐
Algorithm1576几秒前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明9 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2116 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu17 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202117 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
小俊俊的博客18 分钟前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh20 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha31 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc33 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_35 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++