C++(条件判断与循环)
getchar和putchar
getchar()和 putchar()是属于C语言的库函数,C++是兼容 C语言的,所以 C++ 中只要正确包含头文件也可以正常使用这两个函数。
getchar()
函数原型如下:
int getchar(void );
getchar()函数返回用户从键盘输入的一个字符,使用时不带有任何参数。
程序运行到这个命令就会暂停,等待用户从键盘输入,等同于使用 cin 或 scanf()方法读取一个字符。
它的原型定义在头文件#include <cstdio>。
cin与cout
count输出格式的控制
一、整数格式化输出控制
dec
:以十进制格式显示整数(默认格式)。hex
:以十六进制格式显示整数。oct
:以八进制格式显示整数。
二、浮点数格式化输出控制
fixed
:以固定小数点形式表示浮点数,设置后不会以科学计数法展示。scientific
:以科学计数法表示浮点数。setprecision
:设置浮点数的精度,用于控制小数点后的数字位数,一般先使用fixed
固定小数点,再设置精度。
头文件是#include <iomanip>
三、输出格式(字段与填充)控制
setw
:设置字段宽度(仅对紧接着的输出项有效)。setfill
:设置填充字符。
sqrt函数
头文件#include <cmath>
通过sqrt(x)来计算X的平方根
fabs 函数
1. 函数功能
- 用于计算浮点数的绝对值
- 与整数绝对值函数
abs()
对应,但专门处理浮点类型
2. 头文件
- C 语言:需包含
<math.h>
- C++ 语言:可包含
<math.h>
或<cmath>
3. 函数原型
- 针对
double
类型:double fabs(double x);
- 针对
float
类型(C99 及以上):float fabsf(float x); // 单精度版本
- 针对
long double
类型(C99 及以上):long double fabsl(long double x); // 长双精度版本
4. 参数与返回值
- 参数:
x
为需要计算绝对值的浮点数 - 返回值:
x
的绝对值(非负值),类型与参数一致
5. 使用示例
c
运行
#include <stdio.h>
#include <math.h>int main() {double a = -3.14;float b = -2.718f;printf("double绝对值: %.2f\n", fabs(a)); // 输出: 3.14printf("float绝对值: %.2f\n", fabsf(b)); // 输出: 2.72return 0;
}
6. 注意事项
- 区分
abs()
与fabs()
:abs()
用于整数,fabs()
用于浮点数,混用会导致精度问题或编译错误 - 编译时注意:部分编译器(如 GCC)需要链接数学库,添加
-lm
参数(如gcc test.c -o test -lm
) - 对于复数的绝对值计算,需使用专门的
cabs()
函数(针对double
复数) - 当输入为
NaN
(非数值)时,返回值仍为NaN
;当输入为无穷大时,返回正无穷大
三目操作符(条件运算符)
基本格式
条件表达式 ? 表达式1 : 表达式2
运算逻辑
- 先判断条件表达式真假(非 0 为真,0 为假)
- 若为真,返回表达式 1 的值;若为假,返回表达式 2 的值
使用示例
int a = 5, b = 3; int max = (a > b) ? a : b; // max = 5(因a > b为真,返回a)
特点
- 是 C++ 中唯一的三目运算符(需要 3 个操作数)
- 可替代简单的
if-else
判断,使代码更简洁 - 运算结果可直接赋值给变量或作为表达式一部分
注意事项
- 表达式 1 和表达式 2 类型需兼容(或可隐式转换)
- 避免嵌套过深(影响可读性),复杂逻辑建议用
if-else
- 结合优先级较低,复杂条件建议加括号明确逻辑
Switch语句
基本语法
switch (表达式) {case 常量表达式1:// 执行语句1break;case 常量表达式2:// 执行语句2break;// 更多 case 分支default:// 表达式不匹配任何 case 时执行的语句
}
- 表达式:结果必须是整数类型(
int
、char
等,enum
类型也可)。 - case 常量表达式:值必须是与表达式类型兼容的常量,且各
case
常量值唯一。 - break:用于跳出
switch
结构,若省略,会继续执行下一个case
的代码(“穿透” 现象)。 - default:可选,用于处理表达式不匹配所有
case
的情况,通常放最后,也可省略。
示例
#include <iostream>
using namespace std;
int main() {int num = 2;switch (num) {case 1:cout << "数字是 1" << endl;break;case 2:cout << "数字是 2" << endl;break;case 3:cout << "数字是 3" << endl;break;default:cout << "数字不是 1、2、3" << endl;}return 0;
}
输出:数字是 2
穿透性(省略 break)
#include <iostream>
using namespace std;
int main() {int grade = 'B';switch (grade) {case 'A':cout << "优秀" << endl;// 无 break,穿透到 case 'B'case 'B':cout << "良好" << endl;// 无 break,穿透到 case 'C'case 'C':cout << "合格" << endl;break;default:cout << "不合格" << endl;}return 0;
}
输入 'B'
,输出:
plaintext
良好
合格
注意事项
- 常量要求:
case
后必须是常量,不能是变量或表达式。 - 类型匹配:
switch
表达式与case
常量类型要兼容。 - default 位置:
default
可在任意位置,但通常放最后,且执行完default
后若没有break
,也会继续 “穿透”(不过一般default
放最后且加break
)。 - 适用场景:适合多分支且条件为离散常量的情况,比多个
if - else if
结构更简洁。
while 语句
基本语法
while (循环条件) {// 循环体(要重复执行的代码)
}
- 执行逻辑:先判断循环条件,若为
true
则执行循环体,执行完后再次判断条件,直到条件为false
时退出循环。
特点
- 先判断后执行:循环体可能一次都不执行(若初始条件为
false
)。 - 适合场景:当循环次数不确定,仅知道终止条件时使用。
示例
- 基本用法(输出 1~5):
int i = 1;
while (i <= 5) {cout << i << " ";i++; // 必须有使条件趋于false的语句,否则会无限循环
}
// 输出:1 2 3 4 5
- 无限循环与 break:
int n = 0;
while (true) { // 条件恒为true,无限循环n++;if (n > 3) break; // 满足条件时跳出循环cout << n << " ";
}
// 输出:1 2 3
注意事项
- 循环体内必须包含改变循环条件的语句(如
i++
),否则可能导致无限循环。 - 循环条件必须是布尔表达式(结果为
true
或false
)。 - 若循环体只有一条语句,可省略大括号
{}
,但建议始终添加以增强可读性
ceil(向上取整)与floor(向下取整)函数
一、头文件
所有取整函数均需要包含头文件 <cmath>
二、向下取整函数:floor()
- 功能:返回小于或等于输入值的最大整数(向负无穷方向取整)
- 语法:
double floor(double x);
- 示例
floor(3.8) → 3.0 floor(3.2) → 3.0 floor(-3.8) → -4.0 // 注意负数的处理 floor(-3.2) → -4.0 floor(5.0) → 5.0
三、向上取整函数:ceil()
- 功能:返回大于或等于输入值的最小整数(向正无穷方向取整)
- 语法:
double ceil(double x);
- 示例
ceil(3.8) → 4.0 ceil(3.2) → 4.0 ceil(-3.8) → -3.0 // 注意负数的处理 ceil(-3.2) → -3.0 ceil(5.0) → 5.0
四、特殊说明
参数与返回值类型:
- 输入可以是
double
或float
类型 - 返回值为
double
类型(即使结果是整数,也会带小数部分)
- 输入可以是
整数转换:如果需要得到整数类型结果,需显式转换:
int a = static_cast<int>(floor(3.8)); // a = 3 int b = static_cast<int>(ceil(3.2)); // b = 4
常见错误点:
- 对负数取整时容易混淆方向(如
floor(-3.2)
结果是-4.0
而非-3.0
) - 忘记包含
<cmath>
头文件会导致编译错误
- 对负数取整时容易混淆方向(如
五、应用场景
- 向下取整:计算数组分组、时间片划分等需要 “不超过某值” 的场景
- 向上取整:计算最少容器数量、分页总数等需要 “不少于某值” 的场景
pow函数
1. 头文件包含
使用 pow()
函数前,需要包含 <cmath>
头文件,它提供了一系列数学函数和相关的常量定义,例如常见的三角函数、指数函数等。
cpp
运行
#include <cmath>
2. 函数原型
pow()
函数有两个重载形式:
double pow(double base, double exponent);
float pow(float base, float exponent);
long double pow(long double base, long double exponent);
- 参数:
base
:表示底数,即要进行幂运算的基础数值,可以是整数、浮点数等。exponent
:表示指数,决定了底数需要自乘的次数,同样可以是整数、浮点数等。
- 返回值:返回
base
的exponent
次幂的结果,返回值类型与参数类型一致,即如果传入的是double
类型参数,返回值也是double
类型 。
3. 示例代码
#include <iostream>
#include <cmath>int main() {// 计算 2 的 3 次方double result1 = pow(2, 3);std::cout << "2 的 3 次方结果是:" << result1 << std::endl; // 计算 4.5 的 1.5 次方double result2 = pow(4.5, 1.5);std::cout << "4.5 的 1.5 次方结果是:" << result2 << std::endl; // 计算 10 的 0 次方double result3 = pow(10, 0);std::cout << "10 的 0 次方结果是:" << result3 << std::endl; return 0;
}
4. 注意事项
- 特殊情况处理:
- 当底数
base
为负数且指数exponent
为小数时,结果是一个复数,但pow()
函数返回的是double
类型,此时会返回NaN
(Not a Number),表示非数值。例如pow(-2, 0.5)
。 - 当指数
exponent
很大时,可能会导致结果溢出,超出数据类型所能表示的范围,这种情况下结果是未定义的。
- 当底数
- 精度问题:由于浮点数在计算机中的存储方式是近似表示,对于一些幂运算,可能会存在精度误差。例如
pow(0.1, 3)
得到的结果与理论值在小数点后若干位可能会有细微差异。 - 替代方案:在一些特定场景下,比如指数是整数且较小,也可以使用循环来实现幂运算,这样可以避免
pow()
函数可能带来的精度和性能问题(pow()
函数内部实现相对复杂)。例如:
int base = 2;
int exponent = 3;
int result = 1;
for (int i = 0; i < exponent; ++i) {result *= base;
}
5. 应用场景
pow()
函数在很多领域都有应用,如:
- 数学计算:用于求解各种幂运算相关的数学问题,如计算复利(假设本金为
P
,年利率为r
,存款年限为n
,则最终金额A = P * pow(1 + r, n)
)。 - 科学计算:在物理、化学等学科中,计算与幂次相关的公式,比如计算电场强度、放射性物质的衰变等。
- 算法和数据处理:在一些算法实现中,例如计算某些数据的权重值(可能涉及幂运算) ,或者在图像处理中计算亮度调整等(可能涉及亮度值的幂次变换)。
do-while 语句
- 语法结构
do {// 循环体语句
} while (条件表达式); // 注意末尾分号
- 执行逻辑
- 先执行一次循环体,再判断条件
- 条件为
true
则重复执行,为false
则退出循环 - 至少执行一次循环体(与 while 的区别)
- 适用场景
- 需要先执行后判断的场景(如菜单选择、输入验证等)
- 示例
int n;
do {cin >> n; // 至少输入一次
} while (n < 0); // 直到输入非负数才退出
- 注意事项
- 循环体若为单条语句,可省略
{}
,但建议始终添加 - 条件表达式后必须加
;
,否则语法错误 - 避免死循环:确保循环体内有修改条件的语句