【问题标题】:Is there a simpler way to get three numbers from the user and print them in ascending order?有没有更简单的方法从用户那里获取三个数字并按升序打印?
【发布时间】:2018-01-16 02:10:49
【问题描述】:

我正在完成 Bjarne Stroustrup 的书“使用 C++ 的原理和实践”(第 3 章练习 6)中的练习。您被要求制作一个程序,该程序接受用户输入(3 个整数值)并按从小到大的顺序打印 3 个值。这是我的解决方案,

#include <iostream>
#include <string>
using namespace std;

int main()
{
    cout << "Please enter 3 integers: ";
    int num1, num2, num3;
    while (cin >> num1 >> num2 >> num3) {

    if (num1 < num2 && num2 < num3)
        cout << num1 << ", " << num2 << ", " << num3 << endl;

    if (num2 < num1 && num1 < num3)
        cout << num2 << ", " << num1 << ", " << num3 << endl;

    if (num3 < num1 && num1 < num2)
        cout << num3 << ", " << num1 << ", " << num2 << endl;

    if (num1 > num2 && num1 > num3 && num2 < num3)
        cout << num2 << ", " << num3 << ", " << num1 << endl;

    if (num1 > num2 && num1 > num3 && num2 > num3)
        cout << num3 << ", " << num2 << ", " << num1 << endl;

    if (num1 < num2 && num1 < num3 && num2 > num3)
        cout << num1 << ", " << num3 << ", " << num2 << endl;

    if (num1 == num2 && num1 < num3)
        cout << num1 << ", " << num2 << ", " << num3 << endl;

    if (num1 == num3 && num3 < num2)
        cout << num1 << ", " << num3 << ", " << num2 << endl;

    if (num1 == num2 && num1 > num3)
        cout << num3 << ", " << num2 << ", " << num1 << endl;

    if (num1 == num3 && num2 < num3)
        cout << num2 << ", " << num3 << ", " << num1 << endl;

    if (num3 == num2 && num1 < num3)
        cout << num1 << ", " << num2 << ", " << num3 << endl;

    if (num3 == num2 && num1 > num3)
        cout << num3 << ", " << num2 << ", " << num1 << endl;
   }
}

虽然这对我有用,但它看起来像很多代码,我真的很感激能更“简单”地解决这个问题。

【问题讨论】:

标签: c++ if-statement


【解决方案1】:

您可以将值添加到vector,然后添加sort,并按顺序输出值。

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::cout << "Please enter 3 values" << '\n';
    std::vector<int> values;
    for (int i = 0; i < 3; ++i)
    {
        int value;
        std::cin >> value;
        values.push_back(value);
    }
    std::sort(values.begin(), values.end());
    std::cout << values[0] << ", " << values[1] << ", " << values[2] << '\n';

    return 0;
}

【讨论】:

  • 做个坏事直到最后:使用基于范围的 for 打印
  • @bolov 是的,但是你需要检查插入逗号的位置,然后是 that turns into a whole debacle.... 所以我懒了:)
  • std::sort(begin(values), end(values)); 在我看来总是更自然,但我想这是一个品味问题。 (对于未来的读者,这两种变体的作用完全相同。)
  • 作弊:用空格而不是逗号打印 :))
  • 他的书中还没有涉及向量或数组。我认为对于他已经教过的内容来说这是一个有点奇怪的练习,但感谢您的帮助,并且当他涉及向量或数组时肯定会回顾它
【解决方案2】:

如果您要将数字存储在顺序数据结构(数组、光照、双端队列)而不是单独的变量中,则可以使用更简单的算法:

  • 对序列进行排序。
  • 按顺序打印序列。

C++ 标准库有一个排序算法:std::sort

【讨论】:

    【解决方案3】:

    函数有助于减少冗余。您可以创建一个函数来获取三个数字并按顺序打印出来。

    void PrintNumbers(int a, int b, int c) {
        cout << a << ", " << b << ", " << c << endl;
    }
    

    那么您所要做的就是调用该方法并以不同的顺序传递数字,而不是每次都重写您的打印逻辑。示例

    PrintNumbers(num1, num2, num3);   
    PrintNumbers(num2, num3, num1);
    PrintNumbers(num3, num2, num1);
    

    此外,如果您考虑使用数组,您可以创建一个排序方法,该方法接受一个数组并返回一个排序后的数组。或者,如果您考虑通过引用(而不是按值)传递变量。然后您可以编写一个方法,使num1 始终是最小的,num2 始终是中间的,num3 始终是最大的。这将使您基本上可以

    拥有这两种方法(一种用于排序,一种用于打印)会将主函数的这一部分基本上变成两行代码。

    SortNumbers(num1, num2, num3);
    PrintNumbers(num1, num2, num3);
    

    或者如果你使用数组(如果可以的话,我建议你这样做)

    int[] sortedNumbers = SortNumbers(myNumbers);
    PrintNumbers(sortedNumbers);
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      int main()
      {
          std::vector<int> values;
      
          for (int i = 0; i < 3; ++i)
          {
              int value;
              std::cin >> value;
              values.push_back(value);
          }
          std::cout << std::fminf(std::fminf(values[0], values[1]), values[2]);
          std::cout << std::fmaxf(std::fminf(values[0], values[1]), std::fminf(values[1], values[2]));
          std::cout << std::fmaxf(std::fmaxf(values[0], values[1]), values[2]);
      
      }
      

      【讨论】:

      • 你的输出会从大到小
      • 还是有问题 enter 4 3 1 output is 114
      • 慢慢来,伙计..如果你解决了这个问题,我会投票赞成:)
      【解决方案5】:

      一些规则。

      如果您想要统一处理一堆数据,除了可能按顺序处理之外,您希望使用数组。

      如果您想按特定顺序放置物品,请对它们进行排序。

      如果您以后不需要它们未排序,则将它们排序。

      不要using namespace std; 这是一个非常坏的习惯。

      std::cout << "Please enter 3 integers: ";
      int num[3]; // an array of 3 integers
      while (std::cin >> num[0] >> num[1] >> num[2] {
        std::sort( std::begin(num), std::end(num) );
        std::cout << num[0] << ", " << num[1] << ", " << num[2] << "\n";
      }
      

      std::endl 都插入换行符并刷新 io 缓冲区。仅在您真的非常想刷新缓冲区时才这样做。

      我们可以进一步改进上述内容:

      enum {count = 3};
      int num[count]; // an array of 3 integers
      std::cout << "Please enter " << count << " integers: ";
      while ( [&]{
        for (int& n:num)
          if (!std::cin >> n) return false;
        return true;
      }()) {
        std::sort( std::begin(num), std::end(num) );
        for (int& n:num) {
          if (&n != num) std::cout << ", ";
          std::cout << n;
        }
        std::cout << "\n";
      }
      

      现在我可以通过在一处更改count 来更改我正在使用的整数数量。计算机科学中有 4 个数字:0、1、2 和无穷大。

      现在,我们在编译时硬编码多少个整数。这有时是个好主意,有时不是。

      std::size_t count; 
      std::cout << "How many integers at a time?";
      if (!std::cin >> count) return -1;
      std::vector<int> num(count); // an array of count integers
      std::cout << "Please enter " << count << " integers: ";
      while ( [&]{
        for (int& n:num)
          if (!std::cin >> n) return false;
        return true;
      }()) {
        std::sort( std::begin(num), std::end(num) );
        for (int& n:num) {
          if (&n != num.data()) std::cout << ", ";
          std::cout << n;
        }
        std::cout << "\n";
      }
      

      现在询问用户每个簇有多少个整数。

      【讨论】:

        【解决方案6】:

        我不使用数组的解决方案:

        void order_integer() { 整数 a, b, c;

        cout << "Enter 3 integers: \n";
        cin >> a >> b >> c;
        if (a <= b && a <= c) {
            if (b <= c) cout << a << ' ' << b << ' ' << c << endl;
            if (c <= b) cout << a << ' ' << c << ' ' << b << endl;
        }
        
        else if (b <= a && b <= c) {
            if (a <= c) cout << b << ' ' << a << ' ' << c << endl;
            if (c <= a) cout << b << ' ' << c << ' ' << a << endl;
        }
        
        else if (c <= a && c <= b) {
            if (a <= b) cout << c << ' ' << a << ' ' << b << endl;
            if (b <= a) cout << c << ' ' << b << ' ' << a << endl;
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2017-05-13
          • 1970-01-01
          • 2017-10-07
          • 1970-01-01
          • 2020-02-20
          • 1970-01-01
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多