北航刷题笔记 其四

北航刷题笔记 其四
fufhaha2.结构化编程
1.scanf(“”)中不能有任何符号,按照输入格式来,严格。
2.看因数
3.char *fgets(char *str, int n, FILE *stream);(有时候字符串数组最后还有个结束符’\0’)
fgets()
是 C 标准库中的一个函数,用于从文件或标准输入中读取一行字符串,直到遇到换行符、文件结束符(EOF),或者达到最大读取字符数为止。它的定义在 <stdio.h>
中。
这个输入语句可以输入包括空格的,但是scanf不行,scanf遇到空格会停下来
一般使用stream是stdin
参数说明
- **
str
**:用于存储读取内容的字符数组的指针。 - **
n
**:要读取的最大字符数(包括字符串结尾的\0
)。 - **
stream
**:输入流,可以是文件指针(如stdin
)。
返回值
- 如果成功,返回
str
的地址。 - 如果遇到文件结束(EOF)或发生错误,返回
NULL
。
4.矩形嵌套:
要判断三个矩形是否能够完整嵌套,需要满足以下条件:
定义嵌套规则: 一个矩形 AAA 可以嵌套在另一个矩形 BBB 中,当且仅当:
min(A
长,A宽)>min(B长,B宽)且
max(A
长,A宽)>max(B长,B宽)即,矩形 A的两边分别比矩形 B 的两边大。
算法步骤
- 排序矩形: 首先,对每个矩形的长和宽重新排序,保证每个矩形是以 (较短边, 较长边) 表示。
- 按照尺寸排序: 按照矩形的短边和长边依次排序,确保矩形按面积从小到大排列。
- 逐对检查嵌套关系: 检查排序后的矩形是否满足上述嵌套条件。
5.结构体成员的排序比较:
c中:
qsort
:属于 C 标准库中的函数,位于 <stdlib.h>
qsort
是 C 标准库中的快速排序函数,定义如下:
1 | void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); |
base
: 指向要排序的数组的起始地址。nitems
: 数组中元素的个数。size
: 数组中每个元素的大小(以字节为单位)。compar
: 指向一个用户定义的比较函数,用来比较两个元素的大小。
排序逻辑
1. qsort
内部调用用户定义的比较函数
qsort
会在排序过程中对数组的元素进行多次比较。
它会通过传入的比较函数 compare
来确定两个元素的相对顺序:
1 | int compare(const void *a, const void *b) { |
- 比较逻辑:
- 如果两个矩形的短边 (
shortSide
) 不同,就以短边为主要排序依据(升序)。 - 如果短边相等,就以长边 (
longSide
) 为次要排序依据(升序)。
- 如果两个矩形的短边 (
2. 排序后的数组 rects
qsort
会对数组rects
中的 3 个矩形按照比较逻辑重新排列。- 排序结果会直接更新到
rects
数组中。
1 | Rectangle *rectA = (Rectangle *)a; |
- 将
void *
指针类型转换**为Rectangle *
**,这样就可以访问Rectangle
结构体的成员变量。
6.进行浮点数运算时有时候有误差,这时可以<=1e-6即可
7.补零操作:%09.7f
是 C 语言中格式化输出的一个格式说明符,用于控制浮点数的显示格式。具体含义如下:
解析 %09.7f
- **
%
**:- 表示这是一个格式说明符的起始标志。
- **
0
**:- 用零填充输出的空位(在数值不足宽度时)。
- **
9
**:- 总的输出宽度为 9 个字符(包括小数点、小数部分和整数部分)。
- 如果实际内容长度不足 9 个字符,前面会用
0
填充。
- **
.7
**:- 表示小数部分的精度为 7,即显示 7 位小数。
- **
f
**:- 表示浮点数的格式(即输出小数形式的数字,如
123.4567890
)。
- 表示浮点数的格式(即输出小数形式的数字,如
8.计算角度:(已知tanα)(math.h中)
先通过atan()函数(在math.h中)(反正切函数)得到弧度。
角度=弧度×(180/π)即
α=atan(tanα)*(180/π)
**atan2(y, x)
**: atan2
是一个更为准确的函数,它能够根据 x
和 y
的符号判断在哪个象限,并返回正确的角度
(注意:如果为负数,要+360)
9.开根号:(math.h中)
sqrt函数:参数:
x
:输入参数,必须是一个非负数。如果传入负数,sqrt()
会返回NaN
(Not a Number)。
返回值:
- 返回
x
的平方根,即√x
。
10.while (scanf(“%d %d %d”, &a, &b, &c) == 3)
如果遇到没有给出具体多少行输入的情况可以用这个
11.返回绝对值:fabs()(math.h)
在比较浮点数精确值的时候可以用这个
12.已知2点坐标,求第三点(x0,y0)到这两点组成的直线的距离:
1 | double numerator = fabs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1); |
直线外一点到直线的距离公式
$$
点 P(x0,y0) 到直线 Ax+By+C=0的距离 D 的计算公式为:
$$
$$
D = \frac{|Ax_0 + By_0 + C|}{\sqrt{A^2 + B^2}}
$$
13.二进制运算:
$$
在二进制中,位从右到左的权值分别是:2^0, 2^1, 2^2, 2^3,以此类推。
$$
所以,0000
表示的十进制值是:
$$
0 \times 2^3 + 0 \times 2^2 + 0 \times 2^1 + 0 \times 2^0 = 0
$$
14.如果要求某一天是星期几,可以用蔡勒公式:
蔡勒公式:
对于公历日期(y
年m
月d
日),星期几的计算公式如下:
$$
h = \left( d + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor \right) \mod 7
$$
其中:
h
是星期几的结果,表示星期几的数字(0: 星期六,1: 星期天,2: 星期一,…,6: 星期五)。d
是日期。m
是月份(1-12),但对于1月和2月,蔡勒公式将其视为前一年的13月和14月。y
是年份,但对于1月和2月,年份需要减去1(即视为上一年)。$$
\left\lfloor x \right\rfloor
$$表示向下取整(即取整数部分)。