我通过这么多版本的算法来排序我的大脑被炸的最小和最大。到目前为止的这本书和在线搜索都没有任何帮助。 我在保存最后一次时遇到了困难。 我用3英寸,10厘米和5厘米作为测试用例。首先输入3,变为最大,进入5厘米秒变为最小,然后10厘米再次变小。尝试了不同的版本超过2个小时,甚至重写了整个部分。在使用C ++编程原理和实践的书中,它在评论部分,在此之前我无法找到任何帮助我的东西。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main()
{
vector<double>all_meters;
double smallest= 0,print_smallest, largest = 0,print_largest, num = 0;
string unit, s_input, num_s_input, small_unit, large_unit;
while(cin.good()){
cout << "\n\t\t\t\tEnter '|' to exit.\n\n";
cout << "\t\tNumber to compare followed by white space and unit:";
cin >> num_s_input;
if(num_s_input.compare("|") == 0 || (s_input.compare("|") == 0)){
double sum = 0;
for (double x : all_meters) sum+=x;
cout << "Sum: " << setprecision(4) << sum << "m\n";
cout << "Smallest number: " << print_smallest << small_unit << endl
<< "Largest number: " << print_largest << large_unit << endl
<< "Total number of values: " << all_meters.size() << endl
<< "All the entered numbers converted to meters are: \n";
for (double i = 0; i<all_meters.size(); ++i){
cout << all_meters[i] << setprecision(2) <<"m ";
}
cout << "\nAlright now, goodbye then !\n" << endl;
break;
}
else{
cin >> s_input;
num = strtod(num_s_input.c_str(), NULL);
unit = s_input;
double meter = 0;
if(unit=="cm"){
meter = num / 100;}
else if(unit=="in"){
meter = num / 39.370;}
else if(unit=="ft"){
meter = num / 3.2808;}
else if(unit=="m"){
meter = num;}
else {
cout << "\n\tYou entered wrong unit!\t\n";}
if(largest==0){
largest = meter;
print_largest = num;
large_unit = unit;
cout << num << unit << " largest so far.\n";
}
else if(smallest==0&&meter<largest){
smallest = meter;
print_smallest = num;
small_unit = unit;
cout << num << unit << " smallest so far.\n";
}
else if(largest<meter){
largest = meter;
print_largest = num;
large_unit = unit;
cout << num << unit << " largest so far.\n";
}
else if(smallest>meter){
smallest = meter;
print_smallest = num;
small_unit = unit;
cout << num << unit << " smallest so far.\n";
}
all_meters.push_back(meter);
sort(all_meters.begin(),all_meters.end());
}
}
}
管理解决它而不使用限制,添加了对代码的新更改。谢谢你的帮助!
答案 0 :(得分:1)
您的问题很可能来自于您将smallest
初始化为0这一事实。如果您从未输入任何小于0的内容,则smallest
将永远不会更改。
找到最小值和最大值时,要将初始值分别设置为可容纳的最大值或最小值。所以在这种情况下我们会使用
double smallest = std::numeric_limits<double>::max();
double largest = std::numeric_limits<double>::lowest()
double num = 0;
您的数据集中的任何内容都应小于smallest
,并且所有内容都应该大于largest
。
这需要#include <limits>
答案 1 :(得分:0)
您需要选择标准的度量单位。问题建议米,所以使用它(你可以使用float
或double
,具体取决于你需要的精度。
问题很简单,为总和创建一些变量,看到最小,看到最大,每个新输入,转换为标准格式,并更新变量。
解决方案(让你开始,而不是工作代码)看起来像这样:
// You can represent the different types of units as integers
float convertToMeters(float unconvertedValue, int unit) {
// Convert unconvertedValue based on unit
}
float smallest = std::numeric_limits<float>::max();
float largest = std::numeric_limits<float>::lowest();
float sum = 0.0f;
// Update for each new input
while (new_input) {
float convertedValue = convertToMeters(new_value, unit);
// Update total
sum += convertedValue;
// Update smallest and largest
if (convertedValue > largest) largest = convertedValue;
else if (convertedValue < smallest) smallest = convertedValue;
}
正如内森所说,#include <limits>
是为了限制。