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;
}
运行后结果如下图: