рассчитать среднее значение медианы c программным массивом - PullRequest
1 голос
/ 24 февраля 2012

У меня есть домашнее задание, в котором пользователю предлагается ввести числа, а затем вычислить среднее значение медианы и режим, после чего я спрашиваю, хочет ли он / она снова играть, и либо повторяет программу, либо выходит.Все компилируется, но я, кажется, могу понять, что происходит несколько ошибок:

Среднее значение работает.Медиана неЕсли массив целых имеет четную длину, то есть 4 числа в массиве, медиана должна быть усреднением двух средних чисел.так что, если числа по порядку «1, 3, 5, 6», то медиана должна быть 4.000000.Режим также не работает, и когда его просят «играть снова?»любой ответ приводит к внезапному завершению работы программы и ее аварийному завершению.Может ли кто-нибудь помочь мне найти ошибку в моих вычислениях среднего среднего значения и помочь мне с меню?

#define MAX 25
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <stdlib.h>

int readTotalNums();
void fillArray(int total, int nums[]);
void sortArray(int nums[], int total);
double findMean(int nums[], int total);
double findMedian(int nums[], int total);
int findMode(int nums[], int total);
void printResults(double mean, double median, double mode);
bool goAgain();

int main()  {
    int nums[MAX];
    int total;
    double mean, median, mode;
    do {
        total = readTotalNums(); //guarantee 1-25
        fillArray(total, nums); //read in the #s don't need to check range
        sortArray(nums, total);
        mean = findMean(nums, total);
        median = findMedian(nums, total);
        mode = findMode(nums, total);
        printResults(mean, median, mode);
    } while (goAgain());
    return 0;
}

int readTotalNums() {
    int num;
    do {
        printf("How many numbers? ");
        scanf("%i", &num);
    } while (num < 1 || num > 25);
    return num;
}

void fillArray(int total, int nums[]) {
    int temp;
    int i;
    printf("Please enter %i numbers\n", total);
    for (i = 0; i <= total-1; i++) {
        scanf("\n%i",&nums[i]);
    }
}

void sortArray(int nums[], int total) {
int x;
int y;
for(x=0; x<total; x++) {
    for(y=0; y<total-1; y++) {
        if(nums[y]>nums[y+1]) {
            int temp = nums[y+1];
            nums[y+1] = nums[y];
            nums[y] = temp;
        }
    }
}
}

double findMean(int nums[], int total) {
    int i;
    double sum = 0.0;
    for(i = 0; i < total; i++) {
        sum += nums[i];
    }
    return (sum/total);
}

double findMedian(int nums[], int total) {
    int temp;
    int i,j;
    for(i=0;i<total;i++)
        for(j=i+1;j<total;j++) {
            if(nums[i]>nums[j]) {
                temp=nums[j];
                nums[j]=nums[i];
                nums[i]=temp;
            }
        }
        if(total%2==0) {
            return (nums[total/2]+nums[total/2-1])/2;
        }else{
            return nums[total/2];
        }
}

int findMode(int nums[],int total) {
    int i, j, maxCount, modeValue;
    int tally[total];
    for (i = 0; i < total; i++) {
         tally[nums[i]]++;
    }
    maxCount = 0;
    modeValue = 0;
    for (j = 0; j < total; j++) {
        if (tally[j] > maxCount) {
            maxCount = tally[j];
            modeValue = j;
        }
    }
    return modeValue;
}

void printResults(double mean, double median, double mode) {
    printf("Mean: %d\tMedian: %d\tMode: %i", mean, median, mode);
}


bool goAgain() {
    char *temp;
    printf("\nWould you like to play again(Y/N)? ");
    scanf("%s", &temp);
    while (temp != 'n' && temp != 'N' && temp != 'y' && temp != 'Y') {
        printf("\nI am sorry that is invalid -- try again");
        printf("\nWould you like to play again(Y/N)? ");
        scanf("%s", &temp);
    }
    if (temp == 'y' || temp == 'Y') {
        return true;
    } else {
        return false;
    }
}

вывод должен выглядеть примерно так:

How many numbers 4
Please enter 4 numbers
6
2
5
25
 Mean: 9.50 Median:  5.50   Mode:  2
Go again (y/n) n

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Ну, я нашел 3 проблемы:

  1. Ваш printf неверен. чтобы напечатать double, вы должны использовать %f. не %d или %i.
  2. Вы должны инициализировать tally перед использованием.
  3. В goAgain, temp должно быть char, и вы должны использовать %c вместо %s.
0 голосов
/ 26 ноября 2015

Для findMedian вам не нужно сортировать весь массив.

for(i=0;i < int(total/2)+1;i++)

Все будет хорошо.

...