我正在编写这个C / C ++程序,它可以找到不同大小数组的均值,中位数和模式。虽然,无论输入如何,我都会收到分段错误。我的代码出了什么问题?任何建议总是赞赏! :)
以下是代码:
#include <stdio.h>
//#include <string.h>
//#include <math.h>
#include <stdlib.h>
原型:
void sort(double*[],int);
static int min(double,double[],int);
double mean(double[],int);
double median(double[],int);
double mode(double[],int);
int numberOf(double,double[],int);
主要功能:
int main() {
int i;
scanf(" %d ",&i); //10
double arr[i]; //array that contains all the values and will be sortted
for (int j=0; j<i; j++) { //64630 11735 14216 99233 14470 4978 73429 38120 51135 67060
scanf(" %lf ",&arr[j]);
}
printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
return 0;
}
排序功能:
最终结果应该从中位函数中的调用更新数组arr。将原始数组中使用的值更改为-1,直到整个数组为止。
void sort(double* arr[],int l) {
double arr2[l];
for (int i=0; i<l; i++) {
int j;
if (i)
j = min(arr2[i-1], *arr, l);
else
j = min(0, *arr, l);
arr2[i] = *arr[j];
*arr[j] = -1;
}
for (int i=0; i<l; i++) {
*arr[i] = arr2[i];
}
}
最小函数(排序函数的辅助函数):
在数组元素中查找大于或等于 minLookingTo 的最小值
返回值所在的位置。
static int min(double minLookingTo,double arr[],int l) {
int minP;
double minA = minLookingTo;
for (int i=0; i<l; i++) {
if (arr[i] == -1)
continue;
if (minLookingTo<=arr[i] && arr[i]<=minA) {
minP = i;
minA = arr[i];
}
}
return minP;
}
平均功能:
返回长度为 l
double mean(double arr[],int l){
double total = 0;
for (int i=0; i<l; i++) {
total += arr[i];
}
return total/l;
}
中位数功能:
使用排序功能。假设有效,则返回中位数。
double median(double arr[],int l){
sort(&arr,l);
double d = arr[(l/2)+1];
double dd = arr[(l/2)];
if (l%2!=0)
return d;
return (d+dd)/2;
}
模式功能:
使用NumberOf函数确定具有最大重复次数的数组元素。返回最高(相等)重复的最低值。
double mode(double arr[],int l){
int maxA;
int maxP;
for (int i=0;i<l;i++) {
int j = numberOf(arr[i],arr,l);
if (j>maxA) {
maxA = j;
maxP = i;
}
else if (j==maxA && arr[maxP]>arr[i])
maxP = i;
}
double d = arr[maxP];
return d;
}
NumberOf功能:
模式功能的辅助功能。返回看值的元素数量。
int numberOf(double looking,double arr[],int l) {
int amount = 0;
for (int i=0; i<l; i++)
if (looking == arr[i])
amount++;
return amount;
}
答案 0 :(得分:1)
您的代码有一系列错误。其中一些:
void sort(double*[],int);
更改为void sort(double[],int);
,在功能中进行必要的更正,并使用sort(arr,l);
而不是sort(&arr,l);
minP
,所以这个变量包含你内存中的垃圾。 for()循环没有输入任何if()条件,因此你的函数结束并返回仍然未初始化的变量minP
。然后使用此随机值访问数组中的索引:j = min(0, arr, l);
min返回一个随机数,然后arr2[i] = arr[j];
访问禁止的内存区域,这会导致您的分段错误错误。 maxP
函数中的变量maxA
和mode()
也出现了同样的问题。访问数组时必须始终小心,不要超出其范围,并始终确保在使用变量时将初始化变量。正如其他人所评论的那样,我也强烈建议您学习如何调试程序,因为这将帮助您分析其执行并跟踪错误。
答案 1 :(得分:1)
我将您的细分错误跟踪到sort()
调用的median()
例程。我没有修复sort()
,而是从库中替换qsort()
来说服自己这就是问题所在:
// Median Function:
// Uses the Sort Function. Assuming that works, returns the median.
int comparator(const void *p, const void *q) {
double a = *((double *) p);
double b = *((double *) q);
return (a > b) - (a < b); // compare idiom
}
double median(double array[], int length) {
// sort(array, length);
qsort(array, length, sizeof(double), &comparator);
double d = array[length / 2];
if (length % 2 != 0) {
return d;
}
double dd = array[(length / 2) - 1];
return (d + dd) / 2;
}
对于提供的数字示例列表,在更正其余代码后,返回中位数为44627.5
其他修正:
你错过了最后的换行符:
printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
您应该初始化mode()
中的变量:
double mode(double array[], int length) {
int maxA = INT_MIN;
int maxP = -1;
for (int i = 0; i < length; i++) {
int j = numberOf(array[i], array, length);
if (j > maxA) {
maxA = j;
maxP = i;
} else if (j == maxA && array[maxP] > array[i]) {
maxP = i;
}
}
return array[maxP];
}