【问题标题】:C++, Overloading, Creating functions in the class that receive an array and the size of the array as input, and find the smallest valueC++,重载,在类中创建函数,接收数组和数组的大小作为输入,并找到最小值
【发布时间】:2018-11-20 21:01:34
【问题描述】:

我目前正在学习 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;
} 

【问题讨论】:

  • 你能解释一下它是怎么不工作的吗?
  • 对于 int 情况,它可以正确输出最小值 2。但是对于浮动条件,它一直给我 0 而不是浮动列表中的数字。
  • 你的方法适用于 int。你只是碰巧得到了正确的答案。
  • 如此多的人在没有评论原因的情况下投了反对票。仅仅因为它是糟糕的代码并不意味着这是一个糟糕的问题。

标签: c++ class overloading


【解决方案1】:

代码不能按预期工作的原因有两个

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

你的代码 sn-p:

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 浮点数是一个大整数,会影响算法的破坏性,这意味着在迭代 arrayInt 时,实际上你用整数 2 覆盖了 4.5 浮点数,这将被解释为一个非常小的浮点数,所以你已经崩溃了arrayInf 数组的第一个元素。

@Bo-r 给出了一个更好的算法示例。

【讨论】:

  • 非常感谢您的详细演练。真的很感激。
【解决方案2】:
float arrayInF[4] = {4.5, 4.9, 4.3, 6.5};

有 4 个值(在代码中使用空格,这样阅读起来更容易)

您传入 4 的 input2(也使用更具描述性的变量名称),这意味着

for(int i=0;i<input2;i++)

i 上升到 3。

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

if(input1[i]<input1[i+1])

当您只有最多 3 个有效索引时,这会完全破坏您的程序。一旦你读/写了无效的内存位置,你的程序的行为就会变得不确定。有时它可能看起来仍然有效,但这只是运气。

此问题不仅限于float 实现。

【讨论】:

    【解决方案3】:

    看来你还没有声明和实现方法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;
    }
    

    【讨论】:

    • 这没有回答问题(尽管它是相关的并且应该是评论)。
    • 感谢您的帮助,我已经添加了 char 类,但是,就像 Matthieu 所说的那样,它并没有解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 2018-07-04
    • 2017-08-18
    • 2014-12-12
    • 2016-07-24
    • 2017-06-26
    • 2020-07-10
    • 2017-02-13
    相关资源
    最近更新 更多