我对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
答案 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)
通过使用一些不同的概念(即stdvector,stdstream和最后一个stdsort
,这相对简单)首先,输入部分可以简化为:
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的版本是更好的解决方案。