Как мне отформатировать две выходные функции, чтобы они были рядом друг с другом? - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю над этим для класса, но я застреваю с правильным выводом.

#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;
}

что я получаю, когда запускаю код

Цельсия по Фаренгейту | Фаренгейт Цельсия
40,00 104,00 |
39,00 102,20 |
38,00 100,40 |
37,00 98,60 |
36,00 96,80 |
35,00 95,00 |
34,00 93,20 |
33,00 91,40 |
32,00 89,60 |
31,00 87,80 |
120,00 48,89
110,00 43,33
100,00 37,78
90,00 32,22
80,00 26,67
70,00 21,11
60,00 15,56
50,00 10,00
40,00 4,44
30,00 -1,11

-1,11 87,80

1 Ответ

0 голосов
/ 09 февраля 2020

В вашем подходе есть один недостаток дизайна.

Вы назначили дополнительные задачи для ваших функций преобразования "celsiusToFahrenheit" и "fahrenheitToCelsius". В вашем подходе они также генерируют вывод. Функциональные возможности / задачи должны быть разделены в вашей программе. Возможно, вы даже заметили, что вы не используете параметры функций.

Итак, давайте перепроектируем и реорганизуем код и сделаем некоторые улучшения:

  1. Мы исключаем все константные литералы из функции и определить их в верхней части программы как значения constexpr. При этом мы можем изменить значение ровно в одном центральном месте, и это повлияет на все функции.
  2. Ширина столбца на экране вывода - это вычисленное значение. Это зависит от самого длинного используемого текста.
  3. Мы определяем функции преобразования выше функции main. Это устраняет необходимость в предварительных декларациях
  4. Функции преобразования сокращены до их основных функциональных возможностей
  5. Мы помещаем все ios флаги в выходной поток вместе со всеми другими манипуляторами
  6. Мы определяем лог c для вывода 2 разных длинных списков в одной строке. По сути, мы проверяем, должна ли быть напечатана конверсия или нет. Если часть по шкале Цельсия в градусах Фаренгейта выполнена, вместо этого мы будем печатать пробелы для текущей строки
  7. Мы рассчитываем следующее значение для преобразования в разных местах
  8. Мы запустим все это в al oop. В начале l oop мы предполагаем, что мы закончили (и должны остановить l oop), но, если мы напечатаем значение, мы продолжим l oop.

Обратите внимание. Есть много много разных решений. Другие решения также намного короче. Но я создал это "подробное" решение, чтобы вы лучше поняли. Пожалуйста, посмотрите, что я добавил много комментариев в коде. Это всегда должно быть сделано. Иначе никто не поймет, что закодировано, и даже ты не поймешь это через месяц. , .

#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;
}
...