gpt4 book ai didi

代码错误 : Segmentation Fault [EVERYTIME]

转载 作者:行者123 更新时间:2023-11-30 21:42:33 27 4
gpt4 key购买 nike

我正在编写这个 C/C++ 程序,该程序旨在查找不同大小数组的平均值、中位数和众数。尽管如此,无论输入如何,我都会遇到段错误。我的代码有什么问题吗?任何建议总是值得赞赏! :)

这是代码:

#include <stdio.h>
//#include <string.h>
//#include <math.h>
#include <stdlib.h>

原型(prototype):

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];
}
}

Min 函数(排序函数的辅助函数):
查找数组元素中大于或等于 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;
}

函数数量:
模式功能的辅助功能。返回具有looking值的元素数量。

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;
}

最佳答案

我将您的段错误跟踪到由 median() 调用的 sort() 例程。我没有修复 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];
}

关于代码错误 : Segmentation Fault [EVERYTIME],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39313445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com