北航刷题笔记 其四

2.结构化编程

1.scanf(“”)中不能有任何符号,按照输入格式来,严格。

2.看因数

3.char *fgets(char *str, int n, FILE *stream);(有时候字符串数组最后还有个结束符’\0’)

fgets() 是 C 标准库中的一个函数,用于从文件或标准输入中读取一行字符串,直到遇到换行符、文件结束符(EOF),或者达到最大读取字符数为止。它的定义在 <stdio.h> 中。

这个输入语句可以输入包括空格的,但是scanf不行,scanf遇到空格会停下来

一般使用stream是stdin

参数说明

  1. **str**:用于存储读取内容的字符数组的指针。
  2. **n**:要读取的最大字符数(包括字符串结尾的 \0)。
  3. **stream**:输入流,可以是文件指针(如 stdin)。

返回值

  • 如果成功,返回 str 的地址。
  • 如果遇到文件结束(EOF)或发生错误,返回 NULL

4.矩形嵌套:

要判断三个矩形是否能够完整嵌套,需要满足以下条件:

  1. 定义嵌套规则: 一个矩形 AAA 可以嵌套在另一个矩形 BBB 中,当且仅当:

    min(A,A)>min(B,B)

    max(A,A)>max(B,B)

    即,矩形 A的两边分别比矩形 B 的两边大。

算法步骤

  1. 排序矩形: 首先,对每个矩形的长和宽重新排序,保证每个矩形是以 (较短边, 较长边) 表示。
  2. 按照尺寸排序: 按照矩形的短边和长边依次排序,确保矩形按面积从小到大排列。
  3. 逐对检查嵌套关系: 检查排序后的矩形是否满足上述嵌套条件。

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
2
3
4
5
6
7
8
9
10
int compare(const void *a, const void *b) {
Rectangle *rectA = (Rectangle *)a;
Rectangle *rectB = (Rectangle *)b;

// 优先比较短边,短边相等时比较长边
if (rectA->shortSide != rectB->shortSide)
return rectA->shortSide - rectB->shortSide;
else
return rectA->longSide - rectB->longSide;
}
  • 比较逻辑:
    1. 如果两个矩形的短边 (shortSide) 不同,就以短边为主要排序依据(升序)。
    2. 如果短边相等,就以长边 (longSide) 为次要排序依据(升序)。

2. 排序后的数组 rects

  • qsort 会对数组 rects 中的 3 个矩形按照比较逻辑重新排列。
  • 排序结果会直接更新到 rects 数组中。
1
2
Rectangle *rectA = (Rectangle *)a;
Rectangle *rectB = (Rectangle *)b;
  • void * 指针类型转换**为 Rectangle ***,这样就可以访问 Rectangle 结构体的成员变量。

6.进行浮点数运算时有时候有误差,这时可以<=1e-6即可

7.补零操作:%09.7f 是 C 语言中格式化输出的一个格式说明符,用于控制浮点数的显示格式。具体含义如下:

解析 %09.7f

  1. **%**:
    • 表示这是一个格式说明符的起始标志。
  2. **0**:
    • 零填充输出的空位(在数值不足宽度时)
  3. **9**:
    • 总的输出宽度为 9 个字符(包括小数点、小数部分和整数部分)
    • 如果实际内容长度不足 9 个字符,前面会用 0 填充
  4. **.7**:
    • 表示小数部分的精度为 7,即显示 7 位小数。
  5. **f**:
    • 表示浮点数的格式(即输出小数形式的数字,如 123.4567890)。

8.计算角度:(已知tanα)(math.h中)

先通过atan()函数(在math.h中)(反正切函数)得到弧度。

角度=弧度×(180/π)即

α=atan(tanα)*(180/π)

**atan2(y, x)**: atan2 是一个更为准确的函数,它能够根据 xy 的符号判断在哪个象限,并返回正确的角度

(注意:如果为负数,要+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
2
3
double numerator = fabs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1);
double denominator = sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
double distance = numerator / denominator;

直线外一点到直线的距离公式

$$
点 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.如果要求某一天是星期几,可以用蔡勒公式:

蔡勒公式:

对于公历日期(ymd日),星期几的计算公式如下:
$$
  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
    $$

    表示向下取整(即取整数部分)。

15.找一个数n的因数时,最大范围可以是sqrt(n)