user3390072
user3390072

Reputation: 1

search array for specific number and count how many times it appears

i have an array of ages from 0-100. you keep entering the ages until sentinel data(-99) is entered.

i need to then count how many times each age appears.

example output:
The number of people 5 years old is 3
The number of people 8 years old is 1
The number of people 9 years old is 1
The number of people 10 years old is 1
The number of people 17 years old is 1
The number of people 20 years old is 2
The number of people 100 years old is 1

However, when i do it, my output it this:

The number of people age 5 is 3
The number of people age 10 is 1
The number of people age 100 is 1
The number of people age 20 is 2
The number of people age 5 is 3
The number of people age 8 is 1
The number of people age 20 is 2
The number of people age 5 is 3
The number of people age 9 is 1
The number of people age 17 is 1

i need to fix it so that it would only display the 5's once, and etc.

here is my code:

    #include <iostream>
    using namespace std;



    const int MAXSIZE = 100;
    int ages[MAXSIZE];

    int findNumOfAges(int ages[], int pos, int i);

    int main()
    {
        int pos = 0;
        int age;

    for(int count = 0; count < MAXSIZE; count++)
{
    ages[count] = 0;
}

do
{
    cout << "Please input an age from one to 100, put -99 to stop." << endl;
    cin >> age;

    if (age >=0 && age <=100)
    {
        ages[pos] = age;

    }
    pos++;

}while(age != -99);

    for(int i = 0; i < pos; i++)
    {
        int numOfAges;

        numOfAges = findNumOfAges(ages, pos, i);

        cout << "The number of people age " << ages[i] << " is " << numOfAges << endl;
    }

}

int findNumOfAges(int ages[], int pos, int i)
{
int numOfAges = 0;

for(int j = 0; j < pos; j++)
{
    if(ages[i] == ages[j])
    {
        numOfAges += 1;
    }
}
return numOfAges;
}

Upvotes: 0

Views: 1853

Answers (2)

Vlad from Moscow
Vlad from Moscow

Reputation: 310990

First of all this loop

do
{
    cout << "Please input an age from one to 100, put -99 to stop." << endl;
    cin >> age;

    if (age >=0 && age <=100)
    {
        ages[pos] = age;

    }
    pos++;

}while(age != -99);

is invalid. You increase pos even if the entered number does not belong to the acceptable range.

It should look the following way

do
{
    cout << "Please input an age from one to 100, put -99 to stop." << endl;
    cin >> age;

    if (age >=0 && age <=100)
    {
        ages[pos++] = age;

    }

} while( age != -99 && pos < MAXSIZE );

Also in the function you should check whether the element was already counted. I would write it the following way

int findNumOfAges( const int ages[], int pos, int i)
{
   int numOfAges = 0;

   int j = 0;
   while ( j < i && ages[i] != ages[j] ) j++;

   if ( j == i )
   {
       for( ; j < pos; j++ )
       {
          numOfAges += ages[i] == ages[j];
       }
   }

   return numOfAges;
}

and in main you have to check the returned value. If it is equal to 0 then you have to skip this element because it was already counted.

Also you could write the function based on standard algorithms. For example

#include <algorithm>
//,,,

int findNumOfAges( const int ages[], int pos, int i)
{
   const int *first = std::find( ages, ages + i, ages[i] );

   if ( first != ages + i ) return 0;

   return ( std::count( first, ages + pos, ages[i] ) );  
}

The other way is to use std::map

In this case you build simply the map from the array

#include <map>

//...

std::map<int, int> m;

for ( int i = 0; i < pos; i++ ) ++m[ages[i]];

for ( const auto &p : m )
{
   std::cout << p.first << '\t' << p.second << std::endl;
}

Also you could use std::map from the very beginning instead of the array.:)

For example

#include <map>

//...

std::map<int, int> m;

do
{
    cout << "Please input an age from one to 100, put -99 to stop." << endl;
    cin >> age;

    if (age >=0 && age <=100)
    {
        ++m[age];

    }
} while( age != -99 );

Upvotes: 3

Melvin Sovereign
Melvin Sovereign

Reputation: 445

You need a second array.

First get all of the ages in the ages array. (You did that.)

Then make a second int array with size 100.

Go through each int of the ages array until you hit -99.

For each age, use the age as an index for the second int array. Add one to whatever was in the second array at that index.

Then go through the second array.

If the value at its index is zero, do nothing. If the value is greater than zero, print: "the number of people of age " << index << " is " << value_at_index

Upvotes: 1

Related Questions