c语言编写函数inputints(),动态分配内存,保存用户输入的n个整数,返回保存这些整数的内存区的基地址。n的值在本函数被调用前已知。函数原型如下:int*input ints(intn); 编写函数sum all(),以inputints()返回的指针和数组元素个数n为参数,对该数组中任意数目的任意相邻元素求和,动态分配内存,保存这些元素的和(此数组称为和数组),对和数组按照元素从小到大的顺序进行排序,返回排序后的和数组的基地址。 例如:如果传入的数组为{1,2,3},则其和数组为{1,3,6,2,5,3},本函数返回的排序后的和数组应为{1,2,3,3,5,6}。即:取0号元,作为从0号元开始的只包含1个相邻元素的和;取0号元和1号元求和,作为从0号元开始的包含2个相邻元素的和:取0号元、1号元和2号元求和,作为从0号元开始的包含3个相邻元素的和。取1号元,作为从1号元开始的只包含1个相邻元素的和,……… 函数原型如下:int *sum all( constint*src,intn):
时间: 2024-03-19 19:45:06 浏览: 78
以下是函数inputints()和sumall()的实现:
```c
#include <stdio.h>
#include <stdlib.h>
int* inputints(int n) {
int* arr = (int*)malloc(n * sizeof(int)); // 动态分配内存
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]); // 读入n个整数
}
return arr;
}
int* sumall(const int* src, int n) {
int len = n * (n + 1) / 2; // 计算和数组的长度
int* sum = (int*)malloc(len * sizeof(int)); // 动态分配内存
int idx = 0;
for (int i = 0; i < n; i++) {
int s = 0;
for (int j = i; j < n; j++) {
s += src[j]; // 求和
sum[idx++] = s; // 将和存入和数组
}
}
// 冒泡排序
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (sum[j] > sum[j + 1]) {
int temp = sum[j];
sum[j] = sum[j + 1];
sum[j + 1] = temp;
}
}
}
return sum;
}
```
函数inputints()首先动态分配n个整数的内存,然后使用scanf()函数从标准输入读入n个整数,并将它们存入动态分配的内存中,最后返回内存区的基地址。
函数sumall()首先计算和数组的长度,然后动态分配内存。接着使用两重循环遍历原数组,对任意数目的任意相邻元素求和,并将它们存入和数组中。最后使用冒泡排序将和数组按照元素从小到大的顺序进行排序,并返回排序后的和数组的基地址。
需要注意的是,调用完函数sumall()后,需要手动释放动态分配的内存,以避免内存泄漏。
阅读全文