跳至主要內容

COMP10002 2023 Semester 期中考复习知识点

AI悦创原创2023年8月27日墨尔本大学CSPython一对一辅导unimelb墨尔本大学CSPython一对一辅导unimelb大约 19 分钟...约 5662 字

0. 待复习知识点

1. EOF

在 C 语言中,EOF 是一个特殊的宏,代表 "End Of File"。其常常被用来表示输入或文件的结束。当读取数据达到文件的结尾或没有更多的输入数据时,许多标准库函数(例如 fgetc()scanf())会返回 EOF 来通知调用者。

几点关于 EOF 的详细说明:

  1. 定义:在 stdio.h 头文件中定义了 EOF,它通常被赋予 -1的值,但这并不是必需的。你只需要知道 EOF 是一个整数常量,并且它的值与任何 char 型的字符都不同。

  2. 使用:当你使用文件操作函数(如 fgetc()fscanf()fread() 等)时,可以检查返回值是否为 EOF 以确定是否达到了文件的末尾。

    FILE *fp = fopen("example.txt", "r");
    if (fp != NULL) {
        int ch;
        while ((ch = fgetc(fp)) != EOF) {
            putchar(ch);
        }
        fclose(fp);
    }

    在上面的例子中,当 fgetc() 到达文件的结尾时,它会返回 EOF,从而结束循环。

  3. 注意事项:一定要确保你使用正确的数据类型来保存可能的 EOF 值。在上面的例子中,我们使用了 int 类型的 ch 来存储 fgetc() 的返回值,而不是 char。这是因为 char 可能只能表示有限的字符集,而 EOF 的值(通常为-1)可能无法在 char 类型中正确表示。

  4. 手动输入:当从标准输入读取数据时,你可以手动触发 EOF 来结束输入。在许多系统上,按下 Ctrl + D (在UNIX和Linux上) 或 Ctrl + Z (在Windows上) 并按回车键可以发送 EOF

总的来说,EOF 是C语言中用于标记文件或输入结束的一个重要常量,它在进行文件操作和数据输入时发挥着重要作用。

使用 fgetc() 读取文件直到结束
perror

在C语言中,perror()是一个库函数,用于打印上一次系统调用失败的原因。这个函数会输出到标准错误流(通常是屏幕),描述最后一次出现的系统错误的字符串。这个字符串的内容取决于全局变量errno的值,这个变量会在很多系统调用或库函数出错时被设置。

当你调用perror("Error opening file");,它会做以下两件事:

  1. 打印你提供的字符串,即 "Error opening file"。
  2. 打印一个冒号和一个空格,然后是一个描述errno当前值的消息。例如,如果errno的值是ENOENT(这通常表示文件或目录不存在),则打印的消息将是 "No such file or directory"。

所以,如果文件不存在,执行上面的perror()调用将在屏幕上显示以下内容:

Error opening file: No such file or directory

通常,在调用了可能设置errno的函数(例如open(), fopen(), read(), write()等)并确定该函数失败后,你会使用perror()来报告错误原因。

2. C 语言输出格式控制细讲

C 语言中,输出格式控制是通过 printf() 函数和相关的格式化字符串来实现的。在 printf() 函数中,格式化字符串可以包含普通字符和格式说明符。格式说明符以 % 字符开始,用于指定后续参数的输出格式。

让我们详细看一下 C 语言中常见的格式说明符:

  1. %d%i: 用于输出整数。

  2. %u: 用于输出无符号整数。

  3. %f: 用于输出浮点数。

  4. %c: 用于输出一个字符。

  5. %s: 用于输出一个字符串。

  6. %x%X: 用于输出十六进制数。%x产生小写字母,%X产生大写字母。

  7. %o: 用于输出八进制数。

  8. %e%E: 用于以科学计数法输出浮点数或双浮点数。

  9. %g%G: 根据值的大小,自动选择%f%e%E)的格式。

  10. %p: 用于输出指针。

  11. %%: 用于输出一个%字符。

除了上述基本格式说明符,printf()还支持一系列的修饰符来进一步控制输出的格式。例如:

示例:

这只是 C 语言中 printf() 函数输出格式控制的一个简单概述。

左对齐与右对齐

在 C 语言的 printf 函数中,左对齐和右对齐的控制是通过格式说明符的修饰来实现的。默认情况下,输出是右对齐的,但可以通过在宽度修饰前加-来实现左对齐。

以下是具体的示例,说明如何使用左对齐和右对齐:

1. 右对齐(默认)

  • 整数:

    printf("%5d", 42);  // 输出:   42
  • 浮点数:

    printf("%8.2f", 3.14);  // 输出:    3.14
  • 字符串:

    printf("%10s", "Hello");  // 输出:     Hello

2. 左对齐

使用-修饰符。

  • 整数:

    printf("%-5d", 42);  // 输出:42
  • 浮点数:

    printf("%-8.2f", 3.14);  // 输出:3.14
  • 字符串:

    printf("%-10s", "Hello");  // 输出:Hello

3. 完整的代码示例:

输出:

右对齐整数:        42
右对齐浮点数:      3.14
右对齐字符串:     Hello
左对齐整数  :42   
左对齐浮点数:3.14 
左对齐字符串:Hello

请注意,在实际输出中,因为空格在这里不可见,所以可能看起来不像预期的对齐,但在实际的控制台上运行这段代码会看到期望的对齐效果。

3. C 各种输入函数汇总

C 语言提供了多种从标准输入(通常是键盘)获取用户输入的方法。下面是几个常用的函数,它们的功能,以及各自的使用场景。

函数描述使用场景
getchar()读取下一个可用的字符当你只需要逐个字符地读取输入时
gets()读取一行,直到遇到换行符,已被弃用由于容易引起缓冲区溢出,这个函数已被弃用
scanf()根据格式字符串读取输入当你需要基于特定格式读取输入,如读取数字、字符串等
fgets()读取一行,直到遇到换行符或达到指定长度读取整行的文本,但要限制最大长度
fscanf()从文件流中按照格式字符串读取输入当你需要从文件或其他流中按格式读取数据
sscanf()从字符串中按照格式字符串读取输入当你需要从已有的字符串中解析数据

以下是关于上述函数的使用场景详解:

getchar()
  • 逐个读取字符。
  • 通常用于字符输入的循环。
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
    // 处理字符
}

4. 大 O 法

首先,对于斐波那契函数的时间复杂度,一个直观的方法是通过递归树来观察它是如何扩展的。

  1. 当我们调用 feb(n),这个调用分裂为两个子调用,即 feb(n-1)feb(n-2)

  2. feb(n-1) 本身再分裂为 feb(n-2)feb(n-3)

  3. 同样地,feb(n-2) 分裂为 feb(n-3)feb(n-4)

当我们把这些调用绘制为树状结构,我们会看到一个递归树,其结构与斐波那契数列类似。

为了理解这个增长,我们需要看看斐波那契数列的增长情况。

斐波那契数列的通项公式可以表达为:
f(n)=ϕn(ϕ1)n5\large f(n) = \frac{\phi^n - (-\phi^{-1})^n}{\sqrt{5}}
其中,
ϕ=1+52\large \phi = \frac{1 + \sqrt{5}}{2}
这是黄金分割率。

关键在于我们只关心最大的增长项,因为这是最终决定复杂度的部分。因此,我们只看 (ϕn\phi^n)。

为了简化,我们可以说斐波那契数列大约以 (ϕn\phi^n) 或 (1.618n1.618^n) 的速度增长。这里,n 是输入大小。

现在,为什么时间复杂度与斐波那契数列的增长相似?

考虑每次递归调用:你有 (T(n)=T(n1)+T(n2)T(n) = T(n-1) + T(n-2))。这个递推关系跟斐波那契数列的定义很相似。实际上,它的解是与 (ϕn\phi^n) 相关的。

由于递归函数的调用数量随着输入大小 n 呈指数级增长,所以我们可以说函数的时间复杂度是 (O(1.618n)O(1.618^n))。但在计算机科学中,我们经常喜欢取最坏情况的上界,所以我们经常将其四舍五入为 (O(2n)O(2^n)),即指数级时间复杂度。

5. C 语言 math.h 常用的方法

在 C 语言中,math.h 是一个提供数学函数和宏定义的标准库。下面列出了一些在 math.h 中常用的方法:

  1. 三角函数

    • double sin(double x): 返回 x 的正弦。
    • double cos(double x): 返回 x 的余弦。
    • double tan(double x): 返回 x 的正切。
  2. 反三角函数

    • double asin(double x): 返回 x 的反正弦。
    • double acos(double x): 返回 x 的反余弦。
    • double atan(double x): 返回 x 的反正切。
    • double atan2(double y, double x): 返回 y/x 的反正切,考虑两者的符号来确定象限。
  3. 双曲函数

    • double sinh(double x): 返回 x 的双曲正弦。
    • double cosh(double x): 返回 x 的双曲余弦。
    • double tanh(double x): 返回 x 的双曲正切。
  4. 指数和对数函数

    • double exp(double x): 返回 e 的 x 次幂。
    • double log(double x): 返回 x 的自然对数 (以 e 为底)。
    • double log10(double x): 返回 x 的对数 (以 10 为底)。
    • double pow(double x, double y): 返回 x 的 y 次幂。
    • double sqrt(double x): 返回 x 的平方根。
  5. 其他函数

    • double ceil(double x): 返回大于或等于 x 的最小整数。
    • double floor(double x): 返回小于或等于 x 的最大整数。
    • double fabs(double x): 返回 x 的绝对值。
    • double fmod(double x, double y): 返回 x 除以 y 的余数。
    • double modf(double x, double *intpart): 将 x 分为整数部分和小数部分。
  6. 近似、误差和舍入函数

    • double frexp(double x, int *exp): 将数字分解为尾数和指数。
    • double ldexp(double x, int exp): 根据尾数和指数计算其值。
    • double erf(double x): 返回 x 的误差函数值。
    • double erfc(double x): 返回 x 的互补误差函数值。
  7. 浮点数比较函数

    • int isgreater(double x, double y): 如果 x 大于 y,则返回非零值。
    • int isless(double x, double y): 如果 x 小于 y,则返回非零值。
      ... 还有其他类似的函数。
  8. 常数

    • M_E: e 的值。
    • M_PI: π 的值。
      ... 以及其他数学常数。

为了使用 math.h 库中的函数,你需要在你的 C 代码中包含这个头文件 (#include <math.h>),并在编译时链接 -lm 选项以链接数学库。

以下是上述函数的使用实例,汇总在同一个代码中:

此代码包含了上述函数的基本使用实例,并用 printf 显示了每个函数的结果。为了使这个代码工作,确保你已经安装了 C 语言的编译器,并正确地包含了 math.h。当你编译这段代码时,记得链接 -lm 选项,例如:

gcc -o math_example math_example.c -lm

然后,运行生成的程序:

./math_example
公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQ

方法二:微信:Jiabcdefh

你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
通知
关于编程私教&加密文章