1

I have this homework assignment where the user is asked to input numbers and then calculates the mean median and mode, followed by asking if he/she wants to play again, and either repeating the program or quitting. Everything compiles, but I can seem to figure out the few things going wrong:

The mean works. the median doesn't. If the array of ints has an even length, ie 4 numbers in the array, the median is supposed to be the middle two numbers averaged out. so if the numbers are '1, 3, 5, 6' in order, then the median should be 4.000000. The mode doesn't work either, and when asked to 'play again?' any answer causes the program to suddenly exit and crash. can someone help me find the error in my mean median mode calculations, and help me with the menu?

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

the output should be something like this:

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
5
  • 1
    %d isn't for doubles, it's for ints. It's %f or %lf for floating point numbers Commented Feb 24, 2012 at 1:43
  • @Avram 6+5 is 11. not 7. Commented Feb 24, 2012 at 1:47
  • this was taken from the prompt, i didnt realize it was wrong haha. well teachers fault, but i still need to calculate the mean median and mode regardless Commented Feb 24, 2012 at 1:54
  • 1
    if (cond) { return true; } else { return false; } is redundant (equivalent with return cond;) if the return value will be used in a boolean context. Commented Aug 13, 2014 at 8:10
  • you should change this line return (nums[total/2]+nums[total/2-1])/2; to return (nums[total/2]+nums[total/2-1])/2.0; Commented Jun 13, 2015 at 23:24

2 Answers 2

2

Well, I found 3 problems:

  1. Your printf is wrong. to print double, you should use %f. not %d or %i.
  2. You should initialize tally before using.
  3. In goAgain, temp should be char, and you should use %c instead of %s.
Sign up to request clarification or add additional context in comments.

Comments

-1

For findMedian, you no need to sort the whole array.

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

Will be fine.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.