高级语言程序设计第六次作业
高级语言程序设计第六次作业
(1)设计一个按值传递和按地址传递呈现不同效果的程序。


(2)编写函数fun(int m, int *k, int xx[]),将小于整数m的非素数存入xx数组中,个数由k返回
由于步骤太多了,本程序除主函数外定义了一个fun函数和一个judge函数,fun用于计数和存值,judge用于判断是否为非素数。



(3)编写函数,将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串。
问题:给S2赋值后,由于s2的长度是999,没有结束符,所以会跑出未初始化内存的标志,即图中的烫

修改:手动添加结束符


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


(5)将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。
注意点:
- 形参写成 int *a(或 int a[])是唯一合法方式
- 数组名 a 做实参时,自动变成指针,无需取地址。


(6)写一个函数打印arr数组的内容,不使用数组下标,使用指针。
不用下标就用指针运算获取每一个元素
要明确指针变量p存的是地址,要获取值一定要解引用


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



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




代码优化:
- 这个矩阵一定是方阵,不用输入两个值
- 只要判断下三角形的部分,出现非0就判断失败
#include<stdio.h>
int main()
{
int arr[99][99];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
int count = 0;
int flag = 1;
//如果下三角出现了非0的数,跳出内循环不再判断,并且改变flag的值
for (int i = 0; i < n&&flag; i++)
{
//加上&&flag才可以让外循环也提前终止;
for (int j = 0; j < i; j++)
{
if (arr[i][j] != 0)
{
flag = 0;
break;
}
}
}
if (flag==1) printf("Yes");
else printf("No");
return 0;
}
输出结果一致。
(9)给定一个按升序排列的二维数组,编写一个函数来判断目标值是否存在于数组中。数组是一个m x n的矩阵,可使用算法快速查询。



(10)编写一个函数,输入一个整数,将其分解为两个质数之和。提示:函数可以声明为int split(int n, int *a, int *b)。n作为传入参数,a和b作为传出参数。若无法分解返回0,可以分解则返回1。
思路:
//如何拆分?
//先获取2~n之间的质数,假设这个质数为p,则n可以被拆成p和n-p
//所以只要同时判断p和n-p是不是质数就好了
//并且,可以只测一半的数,因此获取的是2~n/2之间的数
//注意有返回值0,1所以函数的类型必须是int




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

先覆盖了第一个,再从左往右覆盖,但是没有注意到,第一个给第二个,第二个给第三个,导致所有元素都变成了s[len-1];
正确做法是先把最后一个元素保留起来,避免在后面被换了就找不到了,最后再把s[len-1]赋值给s[0]
而且
//如果从左往右搬,后面的数全都会被s[0]覆盖
//正确的应该是从右往左搬再让一个元素等于前一个元素



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





(13)利用指针,判断两个字符串是否相等。忽略大小写。例如,输入 “hello”和”hELlO”,认为它们是相等的。返回值:1表示相等。0表示不同)。
问题:不可以用if (s1[i] != s2[i]||s1[i] != s2[i] + 32 || s1[i] != s2[i] - 32)因为S1不可能同时等于三个值。
解决://利用tolower或者toupper统一转成小写或者大写再比较



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


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


思考与总结:
本次作业完成的较不顺利,很多思路会混乱,写着写着会理不清楚逻辑,用注释表明每一段程序的目的,以及用函数实现功能的分块会好很多,而且用函数可以直接对返回值进行判断也更加方便,但是注意要用返回值的时候要表明函数类型为int
但是关键还是要多多练习。😁😁😁
说明:devcpp版本较低,无法在for循环里面声明变量,为了方便而且可以重复使用i,用vs2022完成本次作业

浙公网安备 33010602011771号