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

Frequency of given array elements

Hi! I am trying to make a simple program that would determine the number of occurrence or frequency of 20 given array elements according to their respective range. My output should be like this:

Range                  Frequency
0-4                        0
5-9                        1
10-14                      3
15-19                      5
20-24                      7
25-29                      3


However, I don't know how to determine the range of the numbers and display its frequency. I tried to use if-else statement and used another variable to store the frequency but it's no good. Can someone enlighten me about this concept? This is what I have so far:

#include<iostream>
using namespace std;

int main()
{

	int arr[] = {20,23,15,17,29,6,16,11,21,27,19,20,13,16,28,21,20,23,14,26};
	int *ptr=arr;
	int f;

	for(int i=0; i<20; i++){
		if(*ptr>=0||*ptr<=4){
			f++;}
		else if(*ptr>=5||*ptr<=9){
			f++;}
		else if(*ptr>=10||*ptr<=14){
			f++;}
		else if(*ptr>=15||*ptr<=19){
			f++;}
	        else if(*ptr>=20||*ptr<=24){
			f++;}
		else if(*ptr>=25||*ptr<=29){
			f++;}
		else{}
}

	cout << "Range\t\tFrequency"
		 << "\n0-4\n5-9\n10-14\n15-19\n20-24\n25-29" ;

	for(int i=0; i<6; i++){
		cout << f << endl;}

		system("pause>null");
		return 0;
	}
lupacarjie
Newbie Poster
11 posts since Aug 2011
Reputation Points: 11
Solved Threads: 0
 

Firstly, it seems you have only one variable for storing frequency. So its nearly impossible to measure individual frequencies.
Secondly, your algorithm isnt working because everything gets caught up in the first part (>= 0). Because all your items are >= 0, everything is caught in the first iteration.

Please consider the code below:

#include<iostream>
    using namespace std;
     
    int main()
    {
     
    int arr[] = {20,23,15,17,29,6,16,11,21,27,19,20,13,16,28,21,20,23,14,26};
    int *ptr=arr;
    int f[] = {0,0,0,0,0,0};
     
    for(int i=0; i<20; i++){
    if(*ptr>=0&&*ptr<=4){
    f[0]++;}
    else if(*ptr>=5 && *ptr<=9){
    f[1]++;}
    else if(*ptr>=10&&*ptr<=14){
    f[2]++;}
    else if(*ptr>=15&&*ptr<=19){
    f[3]++;}
    else if(*ptr>=20&&*ptr<=24){
    f[4]++;}
    else if(*ptr>=25&&*ptr<=29){
    f[5]++;}
    else{}
    ptr++; // so it reads the next element in the array
    }
     
    cout<<"Range\t\tFrequency"
        <<"\n0-4\t\t"<<f[0] //output first range
        <<"\n5-9\t\t"<<f[1] // second range
        <<"\n10-14\t\t"<<f[2] // third range
        <<"\n15-19\t\t"<<f[3] // fourth range
        <<"\n20-24\t\t"<<f[4] // fifth range
        <<"\n25-29\t\t"<<f[5]; // sixth range
         
    system("pause>null");
    return 0;
    }


Please also note that your expected output should be 4 for the 25-29 range (29,27,28,26)

Yugatha
Newbie Poster
7 posts since Mar 2008
Reputation Points: 11
Solved Threads: 0
 

I'm not too sure why you used a pointer, especially if you said you wanted it simple. A much simpler method is:

#include<iostream>
    using namespace std;
     
    int main()
    {
     
    int arr[] = {20,23,15,17,29,6,16,11,21,27,19,20,13,16,28,21,20,23,14,26};
    int f[] = {0,0,0,0,0,0};
     
    for(int i=0; i<20; i++){
    if (arr[i]<0) continue;
    if(arr[i]>=0&&arr[i]<=4){
    f[0]++;}
    else if(arr[i]<=9){ // We can not have a lower limit because if it was lower, the previous statement would pick it up
    f[1]++;}
    else if(arr[i]<=14){ // Same as above
    f[2]++;}
    else if(arr[i]<=19){ // etc
    f[3]++;}
    else if(arr[i]<=24){ //etc
    f[4]++;}
    else if(arr[i]<=29){ //etc
    f[5]++;}
    else{}
    }
     
    cout<<"Range\t\tFrequency"
        <<"\n0-4\t\t"<<f[0] //output first range
        <<"\n5-9\t\t"<<f[1] // second range
        <<"\n10-14\t\t"<<f[2] // third range
        <<"\n15-19\t\t"<<f[3] // fourth range
        <<"\n20-24\t\t"<<f[4] // fifth range
        <<"\n25-29\t\t"<<f[5]; // sixth range
         
    system("pause>null");
    return 0;
    }


Or, if you want to be tricky, you can use this:

#include<iostream>
    using namespace std;
     
    int main()
    {
     
    int arr[] = {20,23,15,17,29,6,16,11,21,27,19,20,13,16,28,21,20,23,14,26};
    int f[] = {0,0,0,0,0,0};
     
    for(int i=0; i<20; i++){
        if (arr[i] < 0 || arr[i]>=30) continue;
        else
            f[arr[i]/5]++; // Divide the number by 5, then increase the range accordingly
    }
     
    cout<<"Range\t\tFrequency"
        <<"\n0-4\t\t"<<f[0] //output first range
        <<"\n5-9\t\t"<<f[1] // second range
        <<"\n10-14\t\t"<<f[2] // third range
        <<"\n15-19\t\t"<<f[3] // fourth range
        <<"\n20-24\t\t"<<f[4] // fifth range
        <<"\n25-29\t\t"<<f[5]; // sixth range
         
    system("pause>null");
    return 0;
    }


the reason this code works is because if it is outside the range, it ignores it. Otherwise, it divides the number by 5, taking only the whole number result, and increases that number in the array accordingly. Eg 0-4 / 5 = 0, 5-9 / 5 = 1, 10-14 / 5 = 2 etc.

I mean, seeing as there is no point of using the pointer if you are using a limited number For loop.

I will leave it up to you to decide which code you prefer.

Yugatha
Newbie Poster
7 posts since Mar 2008
Reputation Points: 11
Solved Threads: 0
 

Man thank you for giving light to this concept. I didn't know it was that simple, I learned more than enough from your posts. Thanks a lot :)

lupacarjie
Newbie Poster
11 posts since Aug 2011
Reputation Points: 11
Solved Threads: 0
 
Man thank you for giving light to this concept. I didn't know it was that simple, I learned more than enough from your posts. Thanks a lot :)

No worries, glad I could help

Yugatha
Newbie Poster
7 posts since Mar 2008
Reputation Points: 11
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: