954,498 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Mode of an array

I am creating a program which performs statistical analysis of an array. So far i have got an enter array, that gives the min, max and median values and sorts the array. I have not been able to work out the mode. I have been able to find the mode on hardcoded array without the other analysis. Could anyone help me get the mode to work please.
This is the program as is now.

#include <stdio.h>
#include <stdlib.h>

#define N 100
#define MINVAL 0 /* the lowest allowable data value */ 
#define MAXVAL 100 /* the highest allowable data value */ 

int main()
{    
	int a[N] = {0};   
	int i, j, value, n;   
	
	int freq[MAXVAL + 1 - MINVAL] = { 0 }; /* clear the frequency counts to 0. */ 
	size_t k = 0; /* loop counter */ 
	int mode = 0; /* for recording the modal value */ 
   
   	printf("Please enter array : \nTo end and sort array enter 0  \n");  
   
	// Upto 100 items can be created in a[i]   
	scanf("%d", &a[0]);    
	for(i = 1; i < N && a[i-1] < 100 && a[i-1] != 0; i++)      
 	{
 	// Input of the numbers into array a[i]   
	scanf("%d", &a[i]);  
 	}
	n = i;    
 
 	if(a[n-1] > 100) 
 	{    
  		printf("Number must be between 0 and 100");   
    	exit(1);   
	}   
 	
	 if (a[n-1] == 0) 
 	{       
		a[n-1] = 0;     
  		n--;    
  	}    
   
  	printf("Sorted List: \n");    
	 
 	// Simple insertion sort    
	for(i = 1; i < n; i++) 
	{        
 		value = a[i];       
	  	for (j = i - 1; j >= 0 && a[j] > value; j--)        
			a[j + 1] = a[j];       
		a[j + 1] = value;    
	}      
	
	for(i = 0; i < sizeof a / sizeof a[0]; i++) /* for each datum */ 
	{ 
		++freq[a[i]]; /* track the frequency */ 
		if(freq[a[i]] > mode) /* is this now the most common item? */ 
		{ 
		mode = a[i]; /* yes, so log it */ 
		} 
	} 
	printf("The modal value is %d which occurs %d time%s\n", 
		mode, 
		freq[mode], 
		freq[mode] == 1 ? "" : "s"); /* 1 time, 2 time>>s<< */


	//Prints the sorted array    
	for(i = 0; i < n; i++)       
		printf("%d ", a[i]);     
	printf("\n");    
	printf("Min: %d\n", a[0]);    
	printf("Max: %d\n", a[n-1]);   
	printf("Median: %f\n", n % 2 ? a[n/2] : 0.5*(a[n/2] + a[n/2-1]));
	}


This is the code that can get the mode of an entered array.

#include <stdio.h> /* prototype for printf, and def of size_t */ 

#define MINVAL 0 /* the lowest allowable data value */ 
#define MAXVAL 42 /* the highest allowable data value */ 

int main(void) 
{ 
int data[] = { 0, 1, 2, 3, 4, 5, 3, 7 }; /* initialise the data array */ 
int freq[MAXVAL + 1 - MINVAL] = { 0 }; /* clear the frequency 
* counts to 0. 
*/ 
size_t i = 0; /* loop counter */ 
int mode = 0; /* for recording the modal value */ 

for(i = 0; i < sizeof data / sizeof data[0]; i++) /* for each datum */ 
{ 
++freq[data[i]]; /* track the frequency */ 
if(freq[data[i]] > mode) /* is this now the most common item? */ 
{ 
mode = data[i]; /* yes, so log it */ 
} 
} 
printf("The modal value is %d which occurs %d time%s\n", 
mode, 
freq[mode], 
freq[mode] == 1 ? "" : "s"); /* 1 time, 2 time>>s<< */ 

return 0; 
}

Your help would be greatly appriciated, i am eager to learn how to accomplish this.

MV89
Newbie Poster
4 posts since Apr 2009
Reputation Points: 10
Solved Threads: 0
 

Is MV1 any relation ?

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

Yes, but i thought there was no harm in trying to get more help.

MV89
Newbie Poster
4 posts since Apr 2009
Reputation Points: 10
Solved Threads: 0
 

There's no harm in doing so if it eventually looks like you're doing something on your own rather than merely bombing forums waiting for some boob to finish your homework.

If you functionize your second chunk of code, it ought to work with a user-entered array. Such a conversion would seem trivial for the work you've already shown.

int mode(int *data, size_t size)
{
   /* Mostly copy and paste and changing hard-coded array size. */
}

[edit]Heh. Or just change the loop control:

for(i = 0; i < n; i++) /* for each datum */
Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

Please use code tags!
When it is only one line of code I usually post them in bold.
Form your second code listing(just changed one value):
int data[] = { 0, 100, 2, 3, 4, 5, 3, 7 }; /* initialise the data array */
What would happen if the following code gets executed and data[i]=100 ?
++freq[data[i]]; /* track the frequency */

ddanbe
Senior Poster
3,829 posts since Oct 2008
Reputation Points: 2,070
Solved Threads: 661
 

Thank you Dave, that seems to have sorted it, can't believe i missed changing the loop control.

MV89
Newbie Poster
4 posts since Apr 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You