Приведенный выше ответ дает неверное решение, поскольку выравнивание установлено неправильно. Я бы использовал функцию для обработки форматирования:
#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'
.