我目前正在学习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;
}
答案 0 :(得分:1)
代码无法按预期工作的原因有两个
您的代码段:
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;
}