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