我的阵容从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;
}
答案 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