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;
}

运行后结果如下图:

相关推荐
逊嘘12 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
van叶~14 分钟前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
Half-up14 分钟前
C语言心型代码解析
c语言·开发语言
knighthood200125 分钟前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
Source.Liu36 分钟前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng36 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马39 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng42 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin