#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME 20
#define LIST_SIZE 50
typedef struct
{
char *name;
int score;
}RECORD;
float calMean(RECORD list[], int count);
void sortData(RECORD list[], int count);
float calMedian(RECORD list[], int size);
int calMode(RECORD list[], int count);
int main (void)
{
// Declarations
float mean;
float median;
int mode;
FILE *fp;
char fileName[FILE_NAME];
RECORD list[LIST_SIZE];
char buffer[100];
int count = 0;
int i;
// Statements
printf("Enter the file name: ");
gets(fileName);
fp = fopen(fileName, "r");
if(fp == NULL)
printf("Error cannot open the file!\n");
while(fgets(buffer, 100, fp) != NULL)
{
if( count >= LIST_SIZE)
{
printf("Only the first 50 data will be read!\n");
break;
}
if( count < LIST_SIZE)
{
list[count].name = (char*) malloc(strlen(buffer)*sizeof(char));
sscanf(buffer,"%[^,], %d", list[count].name, &list[count].score);
printf("name is %s and score is %d\n", list[count].name, list[count].score);
count++;
}
for( i =0; i < (LIST_SIZE - count); i++)
{
list[count + i].name = 0;
list[count + i].score = 0;
}
}
printf("Read in %d data records\n", count);
mean = calMean(list, count);
sortData(list, count);
mode = calMode(list, count);
printf("%2.2f\n", mean);
fclose(fp);
return 0;
}
float calMean(RECORD list[], int count)
{
float tempMean;
int sum = 0;
int i;
for(i = 0; i < count; i++)
sum += list[i].score;
tempMean = (float) sum/count;
return tempMean;
}
void sortData(RECORD list[], int count)
{
int temp;
int current;
int walker;
float median;
int size = count;
for(current = 0; current < count; current++)
{
for( walker = count-1; walker > current; walker--)
if(list[walker].score < list[walker -1].score)
{
temp = list[walker].score;
list[walker].score = list[walker -1].score;
list[walker -1].score = temp;
}
printf("%d\n", list[current].score);
}
median = calMedian(list, size);
printf("%2.2f\n", median);
return;
}
float calMedian(RECORD list[], int size)
{
float tempMedian;
printf("size is: %d\n", size);
if ( size % 2 == 0)
tempMedian = (float) ((list[size/2].score + list[size/2-1].score)/2.0) ;
else
tempMedian = (float) list[size/2 - 1].score;
return tempMedian;
}
int calMode(RECORD list[], int count)
{
int tempMode = 1;
int i, j;
for(i=0;i<10;i++)
{
list[list[i].score].score++;
}
for(i = 0; i < count; i++)
{
printf("\n%d:",list[i].score);
for(j = 0; j < list[i].score; j++)
{
printf("*");
}
}
printf("\n\n");
return tempMode;
}
嗨,我正在尝试编写一个直方图,列出所有分数和出现频率,然后使用直方图查找所有分数的模式,它们都在 calMode 函数中。
上面的代码是我写这个直方图的尝试,但它不正确
我得到了这个输出:
Enter the file name: in.txt
name is Ada Lovelace and score is 66
name is Linus Torvalds and score is 75
name is Peter Norton and score is 82
name is Ken Thompson and score is 82
name is Steve Wozniak and score is 79
name is Marc Andreessen and score is 60
name is Donald Knuth and score is 60
name is Adele Goldberg and score is 71
name is Grace Hopper and score is 82
name is Bill Joy and score is 91
name is Andrew Tanenbaum and score is 71
name is Brian Kernighan and score is 72
Read in 12 data records
60
60
66
71
71
72
75
79
82
82
82
91
size is: 12
73.50
60:************************************************************
60:************************************************************
66:******************************************************************
71:***********************************************************************
71:***********************************************************************
72:************************************************************************
75:***************************************************************************
79:*****************************************************************************
**
82:*****************************************************************************
*****
82:*****************************************************************************
*****
82:*****************************************************************************
*****
91:*****************************************************************************
**************
74.25
对这个直方图函数的算法有什么建议吗?