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

运行后结果如下图:

相关推荐
小陈工30 分钟前
Python安全编程实践:常见漏洞与防护措施
运维·开发语言·人工智能·python·安全·django·开源
John_ToDebug7 小时前
浏览器扩展延迟加载优化实战:如何让浏览器启动速度提升50%
c++·chrome·windows
是娇娇公主~7 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene7 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
xuxie998 小时前
N11 ARM-irq
java·开发语言
wefly20178 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509809 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默9 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
csdn_aspnet9 小时前
C/C++ 两个凸多边形之间的切线(Tangents between two Convex Polygons)
c语言·c++·算法
kyriewen1110 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript