【发布时间】:2018-03-15 02:24:44
【问题描述】:
所以基本上我正在尝试编写一个程序,它接受一个整数数组,然后输出 Max Min 和 smallest 模式以及它出现的次数。 我已经能够找到最大值和最小值以及模式,但是我的代码输出的不是最小模式,而是首先出现的模式。而且我不确定如何处理具有多种模式的输入。 下面我将发布我的代码: #包括 使用命名空间标准;
int main() {
int p,max,min,mode;
cout << "Enter the number of postive integers:"<< endl;
cin >> p;
int pos[p];
cout << "Now enter postive integers!" <<endl;
for(int i=0; i<p; i++) {
cout << "Positive integer " << i+1 << ":";
cin >> pos[i]; }
max =pos[0];
min =pos[0];
for( int i=0; i<p; i++){
if(pos[i]> max) max=pos[i];
if(pos[i]< min) min=pos[i];
}
cout << "Max=" << max << endl;
cout << "Min=" << min << mode= pos[0];
int count[20];
int t=0;
for(int c=0;c<p; c++)
{
for(int d=0;d<p;d++)
{
if(pos[c]==pos[d])
{
count[c]++;
t++;
}
}
int modepos, maxno=count[0];
for(int e=1;e<p;e++)
{
if(maxno<count[e])
{
maxno=count[e];
modepos=e;
}
}
mode=pos[modepos];
if(t==1) {
cout << "There is no positive integer occuring more
than once." << endl;
}
else {
cout <<"The most occuring positive integer is:"<< mode;
cout << "\nIt occurs " << t << " times." << endl;
} return 0; }
可能有更简单更好的方法来编写代码,但是由于我是初学者并且只学习了循环/条件/数组/变量声明等,我只能在程序中使用它们,任何帮助将不胜感激。
【问题讨论】:
-
对于模式,您可以使用地图
并在每次找到第二个值时增加第二个值,然后扫描一次以获取您刚刚比较和存储的最大值...最小值和最大值跨度> -
int pos[p];-- 这不是有效的 C++。 C++ 中的数组必须使用编译时常量表达式声明其大小,而不是变量。您说您是初学者,如果您想编写有效的 C++ 代码,请深入了解std::vector<int> pos(p);的世界。 (再一次,gcc或clang通过默认允许这种非标准语法导致另一个初学者程序员走上了错误的道路。) -
附注一二:请使用更长、更好的标识符名称,并采用常规缩进样式。两者都会帮助你理解自己的代码,更重要的是,也会帮助我们。
-
如果您自己调试代码并弄清楚发生了什么,它将为您提供最好的服务。了解如何使用调试器。您可能不想在这一分钟停止您正在做的所有事情并掌握调试器,所以使用
cout作为您的临时替身。在每个for()、if()和else、cout变量的顶部,然后在运行代码时观察控制台,并查看程序的行为。 -
最简单的方法就是对其进行排序。然后 min = 数组 [0]。 max = array[size - 1] 然后遍历排序后的数组并计算每个相同数字有多少个并保持总数运行,然后比较一个最小的次数。