C ++,重载,在类中创建函数,以接收数组和数组大小作为输入,并找到最小值

时间:2018-11-20 21:01:35

标签: c++ class overloading

我目前正在学习C ++。处理重载问题时遇到麻烦。该类中的函数应该接收数组和数组的大小作为输入并输出最小值。总共有三个数组,包括int,float和char。我的代码仅在int下工作。我不明白为什么我在下面附加了我的代码。谁能告诉我我的错误? 我知道肯定有比我更好的方法,我真的想弄清楚为什么我的代码不适用于float和char情况。任何帮助将不胜感激。

对于int情况,它可以正确输出最小值2。但是对于float条件,它会一直给我0而不是float列表中的数字。

主要功能

int main()
{
  Compare c;
  int arrayInt[5] = {65,43,2,898,678};
  float arrayInF[4] = {4.5,4.9,4.3,6.5};
  char arrayInC[6] = {'w','z','t','h','e','c'};

  std::cout<<c.findSmaller(arrayInt, 5)<<" is the smallest of the input array\n";
  std::cout<<c.findSmaller(arrayInF, 4)<<" is the smallest of the input array\n";
  std::cout<<c.findSmaller(arrayInC, 6)<<" is the smallest of the input array\n";
  return 0;
}

课程

class Compare
{
public:
    int findSmaller(int input1[],int input2);
    float findSmaller(float input1[],int input2);
};


int Compare::findSmaller(int input1[], int input2)
{
int small;
for(int i=0;i<input2;i++)
{
    if(input1[i]<input1[i+1])
    {
        small = input1[i];
        input1[i+1] = small;
    }
    else
    {
        small = input1[i+1];
        input1[i+1] = small;
    }
}
return small;
}

float Compare::findSmaller(float input1[], int input2)
{
float small;
for(int i=0;i<input2;i++)
{
    if(input1[i]<input1[i+1])
    {
        small = input1[i];
        input1[i+1] = small;
    }
    else
    {
        small = input1[i+1];
        input1[i+1] = small;
    }
}
return small;
}

char Compare::findSmaller(char input1[], int input2)
{
char small;
for(int i=0;i<input2;i++)
{
   if(input1[i]<input1[i+1])
{
    small = input1[i];
    input1[i+1] = small;
}
else
{
    small = input1[i+1];
    input1[i+1] = small;
}
}
return small;
} 

3 个答案:

答案 0 :(得分:1)

代码无法按预期工作的原因有两个

  1. 因为您的算法具有破坏性
  2. 因为您超出了数组范围

您的代码段:

if(input1[i]<input1[i+1]) // <-- 2) over step array when i = (input2 - 1)
{
    small = input1[i];
    input1[i+1] = small;  // <-- 1) this will overwrite the NEXT value
}
else
{
    small = input1[i+1];
    input1[i+1] = small;
}

如果您使用arrayInt输入来完成此操作

int arrayInt[5] = {65,43,2,898,678};

数据在执行时变成{65,43,2,2,2},破坏了原始数据。

c和c ++使用0基本索引,这意味着将4个元素的数组索引为0、1、2、3等,因此当您迭代“ i

|项目0 |项目1 |项目2 |项目3 |项目4 |等

引用input1 [5]将只返回解释为预期数据类型的下一个内存块,在arrayInt情况下为整数。

由于3个数组是一起声明的,因此编译器将它们的空间分配在一起,这意味着arrayInt在物理内存中与arrayInf相邻,这也意味着arrayInt [5]与(int)arrayInf [0]相同。 4.5 float是一个大整数,将具有算法的破坏性,这意味着在对arrayInt进行迭代时,您实际上用整数2覆盖了4.5 float,这将被解释为非常小的float,因此您已经大吃一惊了arrayInf数组的第一个元素。

@ Bo-r提供了一个更好的算法来做您想做的事的例子。

答案 1 :(得分:0)

$(function(){
    $('.froala-editor').froalaEditor();//{'placeholder': 'Enter some text...'})

        setTimeout(function(){
            $('.froala-editor').froalaEditor('events.focus', true);
                console.clear()
                console.log('fired focus trigger!')
        }, 2000)


        $('.froala-editor').on('froalaEditor.focus', function (e, editor) {
            console.log('received focus trigger')
    });

}); 

具有4个值(在您的代码中使用空格,这使读取变得容易得多)

您传入的float arrayInF[4] = {4.5, 4.9, 4.3, 6.5}; (也使用更多描述性的变量名)为4,这意味着

input2

for(int i=0;i<input2;i++) 升至3。

然后您可以在此处(以及其他位置)访问数组索引3和3 + 1 = 4:

i

只有最多3个有效索引时,这完全破坏了程序。读取/写入无效的内存位置后,程序的行为将变得不确定。有时似乎仍然可以正常运行,但这真是运气。

此问题不仅限于if(input1[i]<input1[i+1]) 实现。

答案 2 :(得分:-2)

您似乎尚未声明并实现方法char Compare::findSmaller(char *input1, int input2)

这种实现的一个例子是:

char Compare::findSmaller(char input1[], int input2) {
    assert(input2 >0);
    char small = input1[0];
    for (int i = 1; i < input2; i++)
        if (input1[i] < small)
            small = input1[i];
    return small;
}