高级语言程序第六次作业
| 这个作业属于哪个课程 | 2025高级语言程序设计 (福州大学) |
|---|---|
| 这个作业的要求在哪里 | 高级语言程序设计课程第六次个人作业 |
| 学号 | 102300317 |
| 姓名 | 李东阳 |
(1)设计一个按值传递和按地址传递呈现不同效果的程序。


(2)编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回。


(3)编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串。


(4)编写函数用冒泡法将数组按从小到大的顺序排列。


(5)将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。


(6)写一个函数打印arr数组的内容,不使用数组下标,使用指针。


(7)编写程序,分别找出多个n×m数组的最大值、最小值,并输出两个值的下标。


(8)判断上三角矩阵。上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。本题要求编写程序,判断一个给定的方阵是否上三角矩阵。


(9)给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询。


(10)编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1。


(11) 编写函数void shift(char* s, int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”。


(12)写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和。



(13)利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)。


(14)定义一个一维数组和二维数组,按顺序打印出数组中每个元素的地址。


(15)设计一个分别使用数组名和指针引用数组元素的程序。


思考
- 指针与内存管理
核心理解
指针是C语言的灵魂,它直接操作内存地址,提供了高效的数据访问方式。
关键收获
- 按值传递 vs 按地址传递:按值传递创建副本,不影响原数据;按地址传递直接修改原数据
- 指针运算:
ptr++移动的是整个数据类型的大小,而非单个字节 - 数组名本质:数组名是首元素地址的常量指针(
arr ≡ &arr[0])
重要认知
c
// 这两种访问方式是等价的
arr[i] ≡ *(arr + i)
&arr[i] ≡ arr + i
- 字符串处理技巧
核心算法
三步反转法用于字符串循环移位:
c
void shift(char *s, int n) {
reverse(s, 0, n-1); // 反转前n个
reverse(s, n, len-1); // 反转剩余
reverse(s, 0, len-1); // 整体反转
}
重要细节
- 字符串必须以
'\0'结尾 - 指针移动时要注意边界检查
- 忽略大小写比较时使用
tolower()/toupper()
- 数组与矩阵操作
多维数组理解
二维数组在内存中仍然是线性存储的:
c
matrix[i][j] ≡ *(matrix + i * cols + j)
算法优化
- 二分查找应用于有序二维数组时,可以将其视为一维数组
- 魔方矩阵检查需要验证行、列、对角线之和相等
- 上三角矩阵只需检查主对角线以下的元素
-
质数相关算法
c
int is_prime(int num) {
if (num <= 1) return 0;
if (num == 2) return 1;
if (num % 2 == 0) return 0;// 只需检查到sqrt(num),且跳过偶数
for (int i = 3; i <= sqrt(num); i += 2) {
if (num % i == 0) return 0;
}
return 1;
}
哥德巴赫猜想应用
将偶数分解为两个质数之和,只需检查到n/2即可。
5. 编程范式与最佳实践
函数设计原则
单一职责:每个函数只完成一个明确的任务
明确接口:参数和返回值意义明确
错误处理:考虑边界情况和异常输入
指针使用规范
c
// 好的实践:明确指针用途
void fun(int m, int *k, int xx[]) // k: 输出参数,xx: 输出数组
int split(int n, int *a, int *b) // a,b: 输出参数
- 重要技术点总结
内存地址理解
- 一维数组元素地址连续
- 二维数组按行优先存储
- 指针运算基于数据类型大小
测试策略
c
// 应测试各种边界情况
- 空数组/空字符串
- 单个元素
- 最大值/最小值
- 已排序/逆序数据
- 性能与可读性平衡
性能优化
- 避免不必要的函数调用
- 减少循环嵌套层数
- 使用局部变量代替重复计算
代码可读性
- 有意义的变量名和函数名
- 适当的注释说明算法思路
- 合理的代码结构和缩进
总结
通过这些编程练习,我深刻体会到C语言的强大和灵活。指针提供了直接操作内存的能力,但也要求程序员对内存管理有清晰的认识。良好的编程习惯、严谨的边界检查、合理的算法选择是编写高质量C程序的关键。
C语言的学习是一个循序渐进的过程,从语法基础到底层原理,每一步都需要扎实掌握。这些练习不仅巩固了基础知识,更重要的是培养了系统思维和问题分解的能力,这是编程能力的核心所在。
浙公网安备 33010602011771号