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>中的函数通常使用弧度作为角度的单位,而不是度。如果你使用度作为角度单位,需要先将它们转换为弧度,公式为:弧度=度*(
/180)。
三、解一元二次方程
       了解头文件cmath中一些常见的函数后,我们用它来解一元二次方程,的实根,如果方程没有实根,则输出有关警告信息。
解析:求根公式为,公式中的
符号表示解的两种可能性,即方程的两个解是相同的(当判别
时)或不同的(当判别
时)。这个公式通过直接应用,可以快速找到一元二次方程的解。
- 当判别式时,方程有实数解。 
- 当判别时,方程无实数解,但可能有复数解。 
示例代码如下:
#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;
}运行后结果如下图:
