(1)请编写一个C语言程序,要求如下:
-
在
main函数中定义一个整型数组int arr[] = {3, 7, 2, 9, 5};。 -
定义一个名为
findStats的函数,接收以下参数:- 整型指针(指向数组首元素)
- 数组长度(
int类型) - 两个指针参数,用于返回数组的平均值(double) 和最大值(int) 。
-
在
main中调用findStats后,打印平均值和最大值。
(2)附加要求:
-
必须通过指针算术(如
ptr++)遍历数组,禁止使用下标语法(如arr[i])。 -
若数组为空(长度为0),函数内直接返回不修改结果。
-
平均值保留两位小数。
(3)题解
```
#include<stdio.h>
void findStats(int*arr,int len,int *max,double *avg ){
//把max指向的地址的值赋值为arr指向的地址的值
* max = *arr;
//定义一个求和的变量
int sum = 0;
//数组长度如果为0的话就结束循环
if (len == 0) {
return;
}
//遍历数组
for (int i = 0;i < len;i++) {
if (*max < * arr) {
* max= *arr;
}
sum += *arr;
arr++;
}
*avg = ((double)sum / len);
}
int main() {
//求最大值和平均值
int arr[] = { 3,7,2,9,5 };
//求出数组长度
int len = sizeof(arr) / sizeof(arr[0]);
//定义最大值
int max;
//定义平均值
double avg;
findStats( arr,len,&max,&avg);
printf("%.2f\n", avg);
printf("%d", max);
}
//这个题是我让deepseek帮我出的一道练习题,针对指针和数组方面的.
```
(4)函数思路
1.1题目要求要在函数里对一个数组进行求最大值和平均值,且不能用下标语法,所以传入数组的地址也就是*arr,
1.2题目要求要返回返回平均值和最大值,但是函数通常来说只能返回一个值,所以返回平均值和最大值就得通过指针的方式来进行返回,也就是函数形参里的*max, *avg.
2.1用下标语法求最大值时,会先定义一个最大值的变量,一般来说初始值为数组第一项这里用法相似*max = *arr;意思是把max指向的地址的值赋值为arr指向的地址的值.
2.2这里的*arr表示的是数组的第一项 (arr指向的值默认为数组第一项)
3.1现在应该遍历数组求最大值也就是for循环每一个元素,用if让数组每一项跟max作对比,如果值比max大则当前值赋值给max,在本题中也就是if (*max < * arr) ;当然数组要遍历每一个数那就应该是arr++;,正常来讲++就是加1,但在这里arr是一个地址,所以它每次++都是加上定义arr的类型的占得字符,就比如题中用int定义的arr所以每次arr++;都是再加4个字符.
3.2另外要返回的值是平均值,平均值的公式是总数/元素个数,所以在数组遍历的同时,也应该将它们相加.所以应该先定义一个空值为了存相加的值,也就是int sum = 0;.之后应该将每个遍历的数值相加也就是 sum += *arr;.当然这个必须要放在arr++;之前,要不然就会漏掉一个数.
3.3遍历数组写好了,但有可能会出现传入一个空数组,所以需要再进for循环之前要先判断一下数组中元素是否为0,也就是if (len == 0).
4.1这些都写好以后还差最后一个平均值,在前面已经把所有元素的和求出来了sum,就需要把和/个数的只算出来,但在这之前,无法保证和/个数一定是个整数,所以要进行强制转换也就是(double)sum,这样就可以把平均值的值赋给存平均值地址的变量也就是*avg = ((double)sum / len);.
(5)总结
(1)(2)为deepseek出的题目.第一次做分析,如果有纰漏或错误请指出来,我一定会耐心学习.吐槽一下deepseek识图功能还是有些欠缺.