搜索特定数字的数组并计算它出现的次数

时间:2014-03-06 21:11:12

标签: c++ arrays loops for-loop

我的阵容从0到100岁。你一直输入年龄,直到输入了哨兵数据(-99)。

我需要计算每个年龄出现的次数。

示例输出:
5岁的人数是3 8岁的人数是1 9岁的人数是1 10岁的人数是1 17岁的人口数是1 20岁的人数是2
100岁的人数是1

然而,当我这样做时,我输出它:

5岁的人数是3
10岁的人口数是1 100岁的人口数是1 年龄20岁的人数是2
5岁的人口是3
8岁的人口是1
年龄20岁的人数是2
5岁的人口是3
9岁的人口是1
17岁的人口是1

我需要修复它,以便它只显示5次,等等。

这是我的代码:

    #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;
}

2 个答案:

答案 0 :(得分:3)

首先是这个循环

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);

无效。即使输入的数字不属于可接受的范围,也会增加pos。

它应该看起来如下

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 );

同样在该功能中,您应该检查该元素是否已被计算。 我会用以下方式写它

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;
}

并且在main中你必须检查返回的值。如果它等于0,那么你必须跳过这个元素,因为它已经被计算了。

您也可以根据标准算法编写函数。例如

#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] ) );  
}

另一种方法是使用std::map

在这种情况下,您只需构建数组中的地图

#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;
}

你也可以从头开始使用std :: map而不是数组。:)

例如

#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 );

答案 1 :(得分:1)

你需要第二个阵列。

首先获得age数组中的所有年龄段。 (你做到了。)

然后创建一个大小为100的第二个int数组。

遍历ages数组中的每个int,直到你达到-99。

对于每个年龄,使用age作为第二个int数组的索引。 在该索引的第二个数组中添加一个。

然后浏览第二个数组。

如果索引处的值为零,则不执行任何操作。 如果该值大于零,则打印: “年龄人数”&lt;&lt; index&lt;&lt; “是”&lt;&lt; value_at_index