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

Я пытаюсь написать очень простую программу на 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;
}

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

0

Решение

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

#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',

1

Другие решения

использование 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
//...
2

По вопросам рекламы [email protected]