简体   繁体   English

如何格式化我的两个函数输出,使它们彼此相邻?

[英]How do I format my two function outputs so they are next to each other?

Im working on this for class but I am getting stuck with getting the right output.我正在为课堂做这件事,但我一直无法获得正确的输出。

#include<iostream>
using namespace std;
double celsiusToFahrenheit (double);
double fahrenheitToCelsius (double);
int main ()
{
  double f;
  double c;
  cout.setf (ios::fixed);
  cout.precision (2);
  cout << "Celsius \t" << "Fahrenheit \t" << "| \t" << "Fahrenheit \t" << "Celsius" << endl;
  cout << fahrenheitToCelsius (c) << "\t\t" << celsiusToFahrenheit (c) <<
    endl;

  return 0;
}

double celsiusToFahrenheit (double f)
{
  double fahrenheit;

  for (double celsius = 40.0; celsius >= 31.0; celsius--)
    {
      fahrenheit = (9.0 / 5.0) * celsius + 32.0;
      cout << celsius << "\t\t" << fahrenheit << "\t\t|" << endl;
    }
  return fahrenheit;
}

double fahrenheitToCelsius (double c)
{
  double celsius;
  for (double fahrenheit = 120.0; fahrenheit >= 30.0;
       fahrenheit = fahrenheit - 10)
    {
      celsius = (fahrenheit - 32.0) * 5.0 / 9.0;
      cout << fahrenheit << "\t\t" << celsius << endl;
    }
  cout << endl;
  return celsius;
}

what i get when i run the code当我运行代码时我得到了什么

Celsius Fahrenheit |摄氏华氏| Fahrenheit Celsius华氏度
40.00 104.00 | 40.00 104.00 |
39.00 102.20 | 39.00 102.20 |
38.00 100.40 | 38.00 100.40 |
37.00 98.60 | 37.00 98.60 |
36.00 96.80 | 36.00 96.80 |
35.00 95.00 | 35.00 95.00 |
34.00 93.20 | 34.00 93.20 |
33.00 91.40 | 33.00 91.40 |
32.00 89.60 | 32.00 89.60 |
31.00 87.80 | 31.00 87.80 |
120.00 48.89 120.00 48.89
110.00 43.33 110.00 43.33
100.00 37.78 100.00 37.78
90.00 32.22 90.00 32.22
80.00 26.67 80.00 26.67
70.00 21.11 70.00 21.11
60.00 15.56 60.00 15.56
50.00 10.00 50.00 10.00
40.00 4.44 40.00 4.44
30.00 -1.11 30.00 -1.11

-1.11 87.80 -1.11 87.80

There is one design flaw in your approach.您的方法存在一个设计缺陷。

You assigned additional tasks to your conversion functions "celsiusToFahrenheit" and "fahrenheitToCelsius".您为转换函数“celsiusToFahrenheit”和“fahrenheitToCelsius”分配了额外的任务。 In your approach they do also generate output.在您的方法中,它们也会生成输出。 The functionalities / tasks should be separated in your program.功能/任务应该在您的程序中分开。 You may have even noticed, that you do not use the functions parameters.您甚至可能已经注意到,您没有使用函数参数。

So, let us redesign and refactor the code and do some improvements:所以,让我们重新设计和重构代码并做一些改进:

  1. We eliminate all const literals from the functions and define them on the top of the program as constexpr values.我们从函数中消除了所有 const 文字,并将它们定义为程序顶部的 constexpr 值。 With that, we can change a value on exactly one central place and it will have an impact in all functions.有了这个,我们可以在一个中心位置更改一个值,它将对所有功能产生影响。
  2. The column width on the output screen is a calculated value.输出屏幕上的列宽是一个计算值。 It depends on the longest used text.这取决于使用时间最长的文本。
  3. We define the conversion functions above function main.我们在函数 main 上面定义了转换函数。 That eliminates the need for forward declarations这消除了对前向声明的需要
  4. The conversion functions are stripped down to their essential functionality转换功能被简化为它们的基本功能
  5. We put all ios flags into the output stream, together with all other manipulators我们将所有 ios 标志与所有其他操纵器一起放入输出流中
  6. We define a logic for the output of 2 different long lists in one line.我们为在一行中输出 2 个不同的长列表定义了一个逻辑。 Basically, we check, if a conversion should be printed or not.基本上,我们检查是否应该打印转换。 If the celsius to fahrenheit part is done, then we will print spaces instead for the current line如果摄氏度到华氏度部分完成,那么我们将为当前行打印空格
  7. We calculate the next value to be converted in different places我们在不同的地方计算下一个要转换的值
  8. We run all this in a loop.我们在一个循环中运行所有这些。 At the beginning of the loop, we assume that we are done (and should stop the loop), but, if we print a value, then we will continue the loop.在循环开始时,我们假设我们已经完成(并且应该停止循环),但是,如果我们打印一个值,那么我们将继续循环。

Please note.请注意。 There are many many different solutions.有许多不同的解决方案。 Other solutions are also very much shorter.其他解决方案也非常短。 But I created this "verbose" solution for you to get a better understanding.但我创建了这个“详细”的解决方案,以便您更好地理解。 Please see that I added many comments in the code.请看我在代码中添加了很多注释。 This should always be done.应该始终这样做。 Otherwise nobody else will understand what is coded, and even you will not understand it one month later.否则没有人会理解编码的内容,甚至一个月后您也不会理解。 . . . .

#include<iostream>
#include<iomanip>
#include<string>
#include<algorithm>

// The ranges for that we will do the calculations
// For Fahrenheit values to be converted into Celcius
constexpr double FahrenheitStart = 120.0;       // Start value (inclusive)
constexpr double FahrenheitEnd = 0.0;           // End value (inclusive)
constexpr double FahrenheitStep = 5;            // Decrement step

// For Celcius values to be converted into Fahrenheit
constexpr double CelsiusStart = 30.0;           // Start value (inclusive)
constexpr double CelsiusEnd = -5.0;             // End value (inclusive)
constexpr double CelsiusStep = 1.0;             // Decrement step

// Global texts that may be used in different places
constexpr std::string_view Fahrenheit{ "Fahrenheit" };
constexpr std::string_view Celcius{ "Celcius" };
// The delimiter
constexpr std::string_view Delimiter{ " | " };

// The field width of the columns shall be the maximum text length +1 
constexpr size_t FieldWidth = std::max(Fahrenheit.length(), Celcius.length()) + 1;


// Conversion functions
double celsiusToFahrenheit(const double celsius) {
    return (9.0 / 5.0) * celsius + 32.0;
}

double fahrenheitToCelsius(const double fahrenheit) {
    return (fahrenheit - 32.0) * 5.0 / 9.0;
}

// Print a conversion list for temperatures in Fahrenheit and Celcius
int main()
{
    // Set ios flags and print header
    std::cout << std::right << std::setiosflags(std::ios::fixed) << std::setprecision(2) <<
        std::setw(FieldWidth) << Celcius << std::setw(FieldWidth) << Fahrenheit << Delimiter <<
        std::setw(FieldWidth) << Fahrenheit << std::setw(FieldWidth) << Celcius << "\n";

    // Set start values for conversion functions
    double f = FahrenheitStart;
    double c = CelsiusStart;

    // We want to run a loop;
    bool doCalculation = true;

    // Calculate all values
    while (doCalculation) {

        // We assume that we are maybe done with all values
        doCalculation = false;

        // Check, if we have printed all Celcius values
        if ((c >= CelsiusEnd)) {

            // Print Celcius values and its conversions
            std::cout << std::setw(FieldWidth) << c << std::setw(FieldWidth) << celsiusToFahrenheit(c) << Delimiter;

            // Calculate next value to convert
            c -= CelsiusStep;

            // No, not done, continue the loop
            doCalculation = true;
        }
        else {
            // If all Celcius values have been printed already, then print spaces, if needed
            if (f >= FahrenheitEnd) std::cout << std::setw(FieldWidth * 2) << "" << Delimiter;
        }

        // Check, if we have printed all Fahrenheit values
        if (f >= FahrenheitEnd) {

            // Print Fahrenheit values and its conversions
            std::cout << std::setw(FieldWidth) << f << std::setw(FieldWidth) << fahrenheitToCelsius(f);

            // Calculate next value to convert
            f -= FahrenheitStep;

            // No, not done, continue the loop
            doCalculation = true;
        }
        std::cout << "\n";
    }
    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM