逻辑帮助最小/最大值

时间:2016-01-27 19:39:07

标签: c++ algorithm logic

我通过这么多版本的算法来排序我的大脑被炸的最小和最大。到目前为止的这本书和在线搜索都没有任何帮助。 我在保存最后一次时遇到了困难。 我用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());
        }
    }
}

管理解决它而不使用限制,添加了对代码的新更改。谢谢你的帮助!

2 个答案:

答案 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)

您需要选择标准的度量单位。问题建议米,所以使用它(你可以使用floatdouble,具体取决于你需要的精度。

问题很简单,为总和创建一些变量,看到最小,看到最大,每个新输入,转换为标准格式,并更新变量。

解决方案(让你开始,而不是工作代码)看起来像这样:

// 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>是为了限制。