### 上海市计算机二级C语言复习资料知识点梳理
#### 一、基础知识与语法解析
**1. 逻辑运算符及短路求值**
- **题目背景**: 题目给出了两个逻辑表达式 `r1=a>b>c` 和 `r2=a>b&&b>c`,并询问了执行后的结果。
- **解析**:
- 对于 `r1=a>b>c` 这个表达式,首先计算 `a>b` 的结果,然后将这个布尔值与 `c` 比较。由于布尔值只能是0或1,在C语言中会被当作整数处理,因此当 `a>b` 为真时,实际比较的是 `1>c`,否则比较的是 `0>c`。在此例中,由于 `a>b` 为真 (5>4),接下来比较 `1>c` 即 `1>3`,结果为假,因此 `r1` 的值为0。
- 对于 `r2=a>b&&b>c`,这是一个逻辑与操作,且遵循短路原则。首先计算 `a>b` 的值,为真,则继续计算 `b>c` 的值,也为真,所以 `r2` 的值为1。
**2. 数学函数的使用**
- **题目背景**: 给出了一个数学表达式,要求将其转换为C语言中的表达式。
- **解析**:
- 表达式中的 `log` 和 `sin` 分别对应C语言中的 `log()` 和 `sin()` 函数。
- `log()` 函数默认计算自然对数,而题目中的 `log` 应理解为以2为底的对数,因此需要使用 `log(y)/log(2)` 来表示。
- `sin` 函数接受弧度作为参数,因此需要将角度转换为弧度,即 `75.0 * 3.14 / 180`。
- 整个表达式可以写作: `exp(log(a)/3) * sin(75.0 * 3.14 / 180) / fabs(x - log(y) / log(2))`。
**3. 循环与条件语句综合应用**
- **题目背景**: 给出了一段for循环代码,询问执行后变量的值。
- **解析**:
- 循环中的 `for(i=k=0,j=6;i<j;i++,j--)` 初始化 `i` 和 `k` 均为0,`j` 为6;条件 `i<j` 确保循环的执行;每次循环 `i++` 和 `j--`。
- 在每次循环中,`k += 4*i - 5*j;`,计算 `4*i - 5*j` 的结果并累加到 `k` 上。
- 当 `i` 和 `j` 相等时,循环结束。最终 `i` 和 `j` 的值均为3,`k` 的值为 `-63`。
**4. 指针与数组的使用**
- **题目背景**: 提供了一段代码,要求解释其输出结果。
- **解析**:
- 定义了一个指向整型的指针数组 `a[10]` 和两个整型变量 `b` 和 `c`。
- `a[0]=&b` 将 `a[0]` 指向 `b` 的地址。
- `*a[0]=5` 通过指针 `a[0]` 修改 `b` 的值为5。
- `c=(*a[0])++` 先获取 `*a[0]` 的值 (此时为5),赋给 `c` 后再将 `*a[0]` (即 `b`) 自增1。
- 因此,`b` 的值变为6,`c` 的值为5。
**5. 输入输出格式控制**
- **题目背景**: 给出了一个输入输出示例,要求分析输出结果。
- **解析**:
- 使用 `scanf` 函数读取输入,分别读取一个整型 (`%4d`)、浮点型 (`%f`) 和字符型数组 (`%s`)。
- 输出时,整型占位4位,浮点型保留0位小数,字符数组直接输出。
- 输入数据流为 `2000 15.0 P4isGOOD!`,输出为 `2000 15 P4isGOOD!`。
**6. 字符串与循环结构**
- **题目背景**: 给出了一段遍历字符串并统计特定字符出现次数的代码。
- **解析**:
- 使用 `while(*p)` 循环遍历字符串 `p`。
- 使用 `switch` 语句根据当前字符进行不同的计数操作。
- 最终输出各个计数器的值: `c1=2`, `c2=3`, `c3=7`, `c4=5`。
**7. 宏定义的使用**
- **题目背景**: 提供了一段宏定义的代码,要求分析其执行结果。
- **解析**:
- 定义了一个宏 `sq(X)` 代表 `X*X`。
- 使用宏 `sq(a+b)` 代替 `(a+b)*(a+b)`。
- 最终输出 `s=7`。
#### 二、程序分析与设计
**1. 二维数组的动态填充**
- **题目背景**: 给出了一个程序片段,用于生成杨辉三角形的一部分。
- **解析**:
- 通过两层嵌套循环实现数组 `a[N]` 的动态填充。
- 第一层循环初始化数组中的元素为1。
- 第二层循环对当前索引前的所有元素进行累加。
- 最终输出的数组值为杨辉三角形的部分行。
**2. 字符串处理函数**
- **题目背景**: 提供了一段代码,用于修改字符串中的某些字符。
- **解析**:
- 函数 `fun` 接受一个字符指针作为参数,并将字符串中的每个字符递增3。
- 主函数中调用了 `fun(a+3)`,即从字符串 `a` 的第四个字符开始处理。
- 输出结果为 `1`、`9`、`1`,分别对应原字符串中的 `'3'`、`'7'`、`'2'`。
#### 三、错误检测与修正
**1. 字符串处理错误修正**
- **题目背景**: 给出了一段程序,要求修改其中的错误。
- **解析**:
- 错误1: 第 #04 行的 `scanf` 函数中,应当使用数组名 `line` 而不是 `&line`。
- 错误2: 第 #05 行中,循环条件应检查字符串是否到达结尾 `\0` 而不是换行符 `\n`。
- 错误3: 第 #09 行中,应当输出单个字符而非整个字符串。
以上知识点涵盖了C语言的基础语法、逻辑运算、数组与指针的使用、字符串处理以及宏定义等方面的核心内容,有助于全面理解和掌握C语言的相关知识和技术。