C ++循环-查找最小和第二个最小值

时间:2019-03-04 12:46:11

标签: c++

我对C ++非常陌生。在这里,我试图编写一个没有任何额外库的程序。使用循环从用户输入中查找最小值和第二最小值( 0被排除并退出程序)。

这是我想做的。

#include <iostream>
using namespace std;

int main()
{
    int value=0;
    int SmallestNumber=0;
    int SmallestNumber2=0;

    cout << "Enter number to find the smallest and second smallest(or 0 to exit): ";
    cin >> value;

    while (value != 0) {

        if (value< SmallestNumber && value != 0 )
        {
            SmallestNumber = value;
        }

        else if (value<SmallestNumber && SmallestNumber2 >SmallestNumber && value != 0)
        {
            SmallestNumber2 = value;
        }

        cout << "Enter number to find the smallest and second smallest(or 0 to quit): ";
        cin >> value;

    }

    cout << "Smallest number is: " << SmallestNumber << '\n' << endl;
    cout << "Second Smallest number is: " << SmallestNumber2 << '\n' << endl;

    return 0;
}

但是,此程序无法正常运行。最小的数字查找器仅在我输入负值**时起作用,而第二个最小的数字值始终输出** 0

由于我是C ++的新手,所以我尝试了许多其他解决方案,但这是我真正想到的。

有人可以告诉我程序有什么问题吗,我该如何纠正?

一百万个谢谢!请帮助我:'(


感谢您回答我的问题! 我将初始化更改为此。

int value;
int SmallestNumber=0;
int SmallestNumber2=0;

但是如何初始化最小值和第二个最小值??

这就是我希望程序执行的操作

displaying the smallest and second smallest
    50
    1
    61
    93 
    -35
    38
    0

    -35 smallest
    1 second smallest

4 个答案:

答案 0 :(得分:2)

您将从设置为0的最小值开始,所以您总是会得到小于0的值,这就是为什么拥有std::numeric_limits<int>::max()的原因。

然后,对于第二个最小值,您将永远不会与当前的第二个最小值进行核对,而只是与最大值进行核对,现在您可以使用该最大值。所以改变这个:

if (value>SmallestNumber2 && value != 0)

您可能还应该在主要value != 0语句之外检查if。正如@Caleb提醒我的那样,如果替换为先前的最大值,会发生什么?

答案 1 :(得分:0)

您没有位置将前一个最小值变为第二个最小值,这是行不通的。

考虑以下代码:

int value;
int smallest = std::numeric_limits<int>::max()-1;
int second_smallest = std::numeric_limits<int>::max();

while(true)
{
    cin >> value;

    if(value == 0) break;
    if(value >= second_smallest) continue;
    if(value == smallest) continue; // assuming that a double value does not change anything

    if(value > smallest) // is between them
    {
        second_smallest = value;
        continue;
    }

    //now the case left is that the new value is the smallest
    second_smallest = smallest;
    smallest = value;
}

基本思想:首先,排除事物,然后假定它们不成立。我们从中断情况开始(在这种情况下,我更喜欢使用while(true)来对其内部中断进行手动控制)。然后我们排除了什么都没有发生的情况。剩下的两种情况是,我们处于旧值之间,并且都位于旧值之下,并且我们会相应地处理它们。

在您的代码中,if变得肿。使得难以跟踪已完成的工作和要完成的工作。

其中一个例子是您的代码中有几次&& value != 0,尽管由于您的使用时间而总是如此。

通常,您应该真正学习如何使用调试器,或者至少如何使用有用的消息进行调试。您一开始就将变量设置为零的错误很容易发现。

其他小事:您应该决定一种风格并坚持下去。用主要的第一个字母命名变量是非常不寻常的。骆驼的情况很好,但是smallestNumber会很好。其次,尝试避免使用using namespace std;。这可能导致冲突。而是使用std的单个成员,例如using std::cout;。在源文件中并没有那么大的问题(在标头中就没有太大的问题),但是我建议始终如一地执行以保持良好的例程。

代码中剩下要做的事情是稍后捕获变量是否仍为std::numeric_limits<int>::max()并减去负值,表示没有用户输入,并打印适合的消息而不是这些值。

请注意,当您读整数时,负值是合法的,如果您使用零来中断,则负值可能不是您想要的。您可能要添加一个案例

if(value < 0)
{
    cout << "Value was ignored due to being negative" << endl;
}

答案 2 :(得分:0)

通过使用一些不同的概念(即和最后一个

,这相对简单)

首先,输入部分可以简化为:

std::vector<int> numbers;

std::cout << "Enter multiple numbers, separated by spaces: ";
std::getline(std::cin, line);
std::istringstream stream(line);
while (stream >> number) {
    numbers.push_back(number);
}

现在,由于您希望使用2个最小的数字,因此我建议的方法是在此时简单地对向量进行排序:

std::sort(numbers.begin(), numbers.end());

现在,数字列表按升序排序,这是打印两个第一个值的问题。我把它留给你练习。

答案 3 :(得分:0)

此外,如果您想保持相同的概念并自行执行算法,则几乎没有什么可更改的。

首先,SmallestNumber和SmallestNumber2的初始值必须尽可能高,否则保存的数字只能比初始值低一个。因此,您可以使用INT_MAX。

第二个,第二个最小的数字,在两种情况下需要设置:

  • 输入第二个新值时
  • 设置新的最小值后,旧的最小值变为新的第二个最小值。

第三,这里有很多不必要的代码。如果您从while条件知道值不为null,则检查了太多时间。而且您在cout / cin语句中有代码重复。容易出错。

以下是其外观的一个版本:

    int value= INT_MAX;
    int SmallestNumber=INT_MAX;
    int SmallestNumber2=INT_MAX;


    while (value != 0) {
        if(value > SmallestNumber && value < SmallestNumber2)
        {
            SmallestNumber2 = value;
        }
        else if (value< SmallestNumber)
        {
            SmallestNumber2 = SmallestNumber;
            SmallestNumber = value;
        }
        cout << "Enter number to find the smallest and second smallest(or 0 to quit): ";
        cin >> value;
    }

    cout << "Smallest number is: " << SmallestNumber << '\n' << endl;
    cout << "Second Smallest number is: " << SmallestNumber2 << '\n' << endl;

    return 0;

ps:@darune的版本是更好的解决方案。