Как я могу выровнять числа, которые выводит консоль в той же позиции - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь написать очень простую программу на C ++, которая выводит таблицу соответствия с соответствующими значениями функции синуса x и y. Код, который я написал, выглядит следующим образом:

#include "stdafx.h"
#include <iostream>
#include <cmath>

using namespace std;

int main()
{

    double hw = 4.0;
    int nsteps = 30;
    const double PI = 3.14159;
    const double maxx = hw * PI;
    const double deltax = maxx / nsteps;
    double x = 0.0;
    for (int i = 0; i < nsteps; i++) {
        const double f = sin(x);
        cerr << x << "\t" << f << endl;
        x = x + deltax;
    }
    return 0;
}

Теперь программа работает, но моя проблема в том, что значения не выровнены должным образом, как показано на следующем рисунке Image of program output Так есть ли способ добиться того, чтобы второй столбец значений фактически был столбцом и все значения были выровнены в одной позиции? Что я мог бы использовать вместо \t?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Приведенный выше ответ дает неверное решение, поскольку выравнивание установлено неправильно. Я бы использовал функцию для обработки форматирования:

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

void printxy(double x, double y, int width){
    cout << setw(width) << x << "\t";
    if (y < 0) cout << "\b";
    cout << setw(width) << y << "\n";
}

int main(){
    double hw = 4.0;
    int nsteps = 30;
    const double PI = 3.14159;
    const double maxx = hw * PI;
    const double deltax = maxx / nsteps;
    double x = 0.0;

    int decimals = 6;
    int width = 8;    //Adjust as needed for large numbers/many decimals
    cout << std::setprecision(decimals);
    cout << std::setw(width);
    cout.setf(ios::left);

    for (int i = 0; i < nsteps; i++) {
        const double y = sin(x);
        printxy(x, y, width);
        x = x + deltax;
    }
}

Вывод теперь правильно отформатирован:

0               0
0.418879        0.406736
0.837757        0.743144
1.25664         0.951056
1.67551         0.994522
2.09439         0.866026
2.51327         0.587787
2.93215         0.207914
3.35103        -0.207909
3.76991        -0.587783
4.18879        -0.866024
4.60767        -0.994521
5.02654        -0.951058
5.44542        -0.743148
5.8643         -0.406741
6.28318        -5.30718e-06
6.70206         0.406731
7.12094         0.743141
7.53982         0.951055
7.95869         0.994523
8.37757         0.866029
8.79645         0.587791
9.21533         0.207919
9.63421        -0.207904
10.0531        -0.587778
10.472         -0.866021
10.8908        -0.994521
11.3097        -0.951059
11.7286        -0.743151
12.1475        -0.406746

Я бы также не рекомендовал использовать cerr для подобных операций печати. Предназначен для печати ошибок. Используйте взамен cout (он работает одинаково для всех практических целей).

Я должен также упомянуть, что endl - это бомба замедленного действия: она сбрасывает выходные данные, что означает, что внутренний буфер потока записывается (будь то консоль, файл или что-то еще). Когда приложения масштабируются и становятся более интенсивными при вводе-выводе, это может стать серьезной проблемой производительности: буфер, предназначенный для повышения производительности ввода-вывода, потенциально не используется из-за частых вставок endl. Решением является использование символа новой строки '\n'.

0 голосов
/ 02 мая 2018

Используйте std::setprecision(), чтобы установить число для десятичного числа после запятой, и std::setw(), чтобы установить ширину выходной длины. Включить <iomanip> необходимо, например:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{

    double hw = 4.0;
    int nsteps = 30;
    const double PI = 3.14159;
    const double maxx = hw * PI;
    const double deltax = maxx / nsteps;
    double x = 0.0;
    cerr << std::setprecision(8);
    for (int i = 0; i < nsteps; i++) {
        const double f = sin(x);
        cerr << std::setw(20) << x << std::setw(20) << f << endl;
        x = x + deltax;
    }
    return 0;
}

Вывод:

                   0                   0
          0.41887867          0.40673632
          0.83775733          0.74314435
            1.256636          0.95105619
           1.6755147          0.99452204
           2.0943933          0.86602629
            2.513272          0.58778697
           2.9321507          0.20791411
           3.3510293         -0.20790892
            3.769908         -0.58778268
           4.1887867         -0.86602363
//...
...