Я пишу эту программу на C/C++, которая, как предполагается, найдет средний, медианный и режим массива различного размера. Хотя, я все равно получаю ошибку сегментации независимо от ввода. Что не так с моим кодом? Любые предложения всегда оценили! :)Ошибка кода: ошибка сегментации [EVERYTIME]
Вот код:
#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;
}
Сортировать Функция:
Конечный результат должен обновить обр массив от вызова в медианной функции. Изменяет используемые значения в исходном массиве до -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;
}
средней Функция:
Возвращает среднее значение введенного массива с длиной л
double mean(double arr[],int l){
double total = 0;
for (int i=0; i<l; i++) {
total += arr[i];
}
return total/l;
}
Медиана Функция:
Использует Sort функции. Предполагая, что работает, возвращается медиана.
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 Функция:
Вспомогательная функция для функции Mode. Возвращает количество элементов с , глядя.
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;
}
Одно предложение, запустить свой код в отладчике – Martin
Это не неправильные вещи вы ищете, но я могу вам сказать, что: 1. Вы 'using 'scanf', [который, как известно, трудно использовать] (http://www.c-faq.com/stdio/scanfprobs.html). 2. Ugh, пожалуйста, не используйте строчные буквы L для имен переменных. 3. Не похоже, что вы приложили все усилия для того, чтобы изолировать, какая часть вашего кода терпит неудачу, и в этом случае этого не должно быть много. – jamesdlin
Вы отметили вопрос как C и C++, поэтому мы не можем определить, какой язык/компилятор вы используете, и вы не определяете, где происходит сбой, поэтому вы, по-видимому, слишком ленивы, чтобы использовать отладчик даже один раз. – kfsone