2012-02-24 4 views
1

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

Средние работы. медиана не делает. Если массив ints имеет четную длину, т. Е. 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 
+1

% d не для двухместных, это для ints. Это% f или% lf для чисел с плавающей запятой – Avi

+0

@Avram '6 + 5' is' 11'. а не '7'. – asaelr

+0

Вы правы – Avi

ответ

2

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

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

@ nandakumar-edamana, пожалуйста, не исправить то, что не сломано. – asaelr

-1

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

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

Будет хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^