一、C语言

1、计算n的阶乘

2、写出代码:1!+2!+3!=?

错误示例:

阶乘求和代码常见错误分析:

变量未初始化

循环中用于存储阶乘结果的变量未赋初值,导致计算结果异常。正确做法是在循环前初始化变量:

循环范围错误

循环终止条件设置不当会导致少计算一项。例如计算1!+2!+3!时,循环应包含上限值:

阶乘计算逻辑错误

错误的阶乘累积方式会导致结果偏差。应在内层循环中重置临时变量:

结果累加位置不当

总和累加若放在内层循环中,会造成重复累加。正确位置应在外层循环末尾:

n个阶乘求和:1!+2!+3!+......+n!=?

3、在一个有序数组中查找某个具体的数字n,(用到二分查找/折半查找)

二分查找的基本概念

二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。其核心思想是通过不断将搜索范围减半来快速定位目标值,时间复杂度为 O(log n)

适用条件

  • 数组必须是有序的(升序或降序)。
  • 适用于静态数据或较少变动的数据集,因为频繁插入/删除会导致排序成本增加。

算法实现步骤

  1. 初始化指针:设置 lowhigh 分别指向数组的首尾元素。
  2. 计算中间索引mid = low + (high - low) / 2(避免整数溢出)。
  3. 比较中间值
    • arr[mid] == target,返回 mid
    • arr[mid] < target,调整 low = mid + 1
    • arr[mid] > target,调整 high = mid - 1
  4. 循环终止:当 low > high 时结束,未找到返回 。

注意事项

  • 边界条件:确保 lowhigh 的更新正确,避免死循环。
  • 整数溢出:使用 mid = low + (high - low) / 2 而非 (low + high) / 2
  • 重复元素:若存在重复值,返回的索引不一定是第一个或最后一个匹配项。

变体场景

  • 查找第一个/最后一个匹配项:通过调整相等时的指针移动逻辑实现。
  • 插入位置查找:返回 low 可得到目标值应插入的位置(如力扣35题)。

复杂度分析

  • 时间O(log n),每次迭代将搜索范围减半。
  • 空间O(1),仅需常量额外空间。

4、编写代码,演示多个字符从两端移动,向中间汇聚

strlen() 函数

strlen() 是 C 语言标准库 <string.h> 中的函数,用于计算字符串的长度(不包括终止符 \0)。

参数说明

  • str:指向以 \0 结尾的字符串的指针。若字符串未以 \0 结尾,行为未定义。

返回值

  • 返回 size_t 类型的无符号整数,表示字符串中字符的个数(不包含 \0)。

使用示例

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    size_t length = strlen(str);
    printf("字符串长度: %zu\n", length); // 输出: 13
    return 0;
}

注意事项

  • 安全性strlen() 不检查缓冲区溢出,需确保字符串以 \0 结尾。
  • 性能:时间复杂度为 O(n),需遍历整个字符串。
  • 与 sizeof 区别
    • strlen() 返回实际字符数。
    • sizeof 返回数组或变量占用的总字节数(包含 \0)。

常见错误

  1. 未初始化的指针
    char *str; // 未初始化
    printf("%zu\n", strlen(str)); // 未定义行为
    

  2. 非字符串参数
    char arr[] = {'a', 'b', 'c'}; // 缺少 \0
    printf("%zu\n", strlen(arr)); // 错误
    

    Sleep(1000);//单位毫秒,1000毫秒等于一秒。

使用Sleep()函数,每间隔设定时间打印下一行

Sleep()函数要有头文件#include <windows.h>

如果直接一行码完,不再罗列很多行,使用system库函数,要有头文件#include<stdlib.h>可以执行系统命令

system 函数概述

system 是 C 标准库中的一个函数,定义在 <stdlib.h> 头文件中。其功能是执行操作系统命令,通常用于调用 shell 或其他命令行解释器来运行指定的命令。

  • 参数command 是要执行的命令字符串。若为 NULL,函数会检查系统中是否存在命令处理器。
  • 返回值
    • 成功时返回命令的退出状态。
    • commandNULL 且命令处理器存在,返回非零值;否则返回 0。
    • 执行失败时返回 -1。

使用示例

#include <stdlib.h>

int main() {
    // 执行系统命令(例如在 Windows 下打开记事本)
    system("notepad.exe");
    return 0;
}

工作原理

  1. 命令解析systemcommand 字符串传递给操作系统的命令处理器(如 /bin/shcmd.exe)。
  2. 子进程创建:操作系统创建一个子进程来执行命令。
  3. 执行结果:子进程执行完毕后,返回状态码给调用进程。

注意事项

  • 安全性风险:直接拼接用户输入作为命令参数可能导致命令注入漏洞。应避免使用未经验证的输入。
  • 跨平台差异:不同操作系统的命令语法可能不同(如 dir 在 Windows 和 ls 在 Unix 下的差异)。
  • 资源开销:每次调用 system 都会启动一个新的 shell 进程,频繁调用可能影响性能。

替代方案

  • 特定任务:使用更专用的库函数(如文件操作优先用 fopen 而非 system("cat file.txt"))。
  • 进程控制:如需更精细的控制,可通过 fork + exec 系列函数实现。

常见用途

  • 调用系统工具(如压缩、文件操作)。
  • 执行脚本或批处理文件。
  • 快速测试命令行功能。

5、编写代码实现模拟用户登录场景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。)

比较2个字符串是否相等,不能使用==,而应该使用一个库函数: strcmp 如果返回值是0表示2个字符串相等

strcmp()函数概述

strcmp()是C语言标准库<string.h>中的字符串比较函数,用于按字典序比较两个以空字符('\0')结尾的字符串。

参数说明

  • str1:待比较的第一个字符串指针
  • str2:待比较的第二个字符串指针

返回值

  • 负数str1字典序小于str2
  • 0str1str2内容完全相同
  • 正数str1字典序大于str2

比较规则

逐字符比较ASCII码值,直到遇到不相等的字符或空字符:

  • 比较"apple"与"apricot"时,前三个字符相同,第四个字符'l'(108) < 'r'(114),返回负数
  • 比较"hello"与"hello"时,所有字符相同且同时遇到空字符,返回0

代码示例

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "abc";
    char str2[] = "abd";
    int result = strcmp(str1, str2);

    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result == 0) {
        printf("str1 equals str2\n");
    } else {
        printf("str1 is greater than str2\n");
    }
    return 0;
}

注意事项

  • 参数必须为以空字符结尾的有效字符串指针
  • 比较结果依赖本地字符集的ASCII值
  • 不会自动处理字符串长度差异,需确保内存安全

与strncmp()的区别

strncmp()可指定比较的最大字符数,避免越界风险:

int strncmp(const char *str1, const char *str2, size_t n);

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐