高级语言程序设计课程第六次个人作业
这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx
这个作业要求在哪里:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/14585
学号:102500305
姓名:赖晓娟
(1)设计一个按值传递和按地址传递呈现不同效果的程序。
按值传递

按地址传递

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

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

错因:在输入字符串后的换行符会被scanf("%c")读取——通过增加getcahr()吸收输入换行符。
(4)编写函数用冒泡法将数组按从小到大的顺序排列。

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

!思路:1.在带指针参数的函数内,用两个指针分别指向数组的起始位置和末尾位置; 2.交换两个指针指向的元素,然后 起始指针后移、末尾指针前移,直到两指针相遇(完成逆序)。
(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。

错因:一开始在split函数里直接在for循环让a(指针变量)初始化并自增——改成int i;让i初始化并自增,然后将i的值赋给a实现。
(11) 编写函数void shift(char s, int n),请原地将字符串s循环左移n次。例如,字符串“hello”左移3次得到“lohel”。*

注意:利用ch[i]=s[(i+m)%len]来实现。
(12)写一个程序读入一个二维整型数组并判断它是否为魔方矩阵。在魔方阵中,所有的行、列和对角线都拥有相同的和。

注意:用int arr[][100]接收二维数组(列数声明为100,兼容任意行数)
(13)利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)。

注意:1. 用ctype.h头文件中的 tolower 将每个字符转为小写后比较,实现忽略大小写。 2. 通过指针遍历字符串( str1++ / str2++ )。 3.注意*str1与str1的区别。
(14)定义一个一维数组和二维数组,按顺序打印出数组中每个元素的地址。

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

错因:1. 函数A的参数问题:一开始代码中 int A(int arr1) ×。参数 arr1 被定义为 int 类型,但实际要传递数组,应改为 int arr1[] ;
*2. 函数B的指针问题:一开始代码中 int p=arr2 × 。arr2 是指针,arr2 是首元素值,应改为定义 int p = arr2 (指针指向数组首地址);
3. main函数的调用问题:一开始代码中调用 B(&arr2) ×: arr2 是数组名,本身就是地址,应改为 B(arr2) 。
总结与反思:1. 对于指针的理解不足:错误地将数组传递、指针混淆(比如把数组首元素值赋值给普通变量,而非指针变量)。
要明确 * 的两种场景:(1)定义指针时: int *p → * 是“指针类型标识”,表示 p 是指向 int 的指针;(2)解引用时: *p → * 是“解引用运算符”,表示访问 p 指向的内存中的值。
2. 数组与指针的关系模糊:不知道“数组名本质是指向首元素的指针”,导致传递参数、访问元素时出现错误。要记得“数组名 = 首元素地址”:传递数组时,直接写数组名(如 A(arr) )即可,无需加 & 。
浙公网安备 33010602011771号