定义一个比例因子来绘制三个量的图形,这三个量的总和是常数
Defining a scale factor to graph three quantities, the sum of which is constant
我正在尝试在标准输出中编写图表,程序 returns 行“#”应该在另一个函数更改它们后加起来等于初始数量。我保证修改数字的函数没有错误。这是我的代码:
struct mystruct {
long long int s;
long long int i;
long long int r;
}
mystruct initial_;
void draw_row(mystruct P)
{
long long int Ntotal = initial_.s + initial_.i;
int scale = round(Ntotal / 10);
std::string a(Ntotal / scale, '#');
std::string b(round(P.s / scale), '#');
std::string c(round(P.i / scale), '#');
std::string d(round(P.r / scale), '#');
std::cout << P.s << " " << P.i << " " << P.r << '\n';
std::cout << scale << '\n';
std::cout << a << '\n' << b << c << d << '\n';
}
这些是它的一些输出示例:
499 1 0
##########
#########
0 450 50
##########
##########
0 249 251
##########
#########
我取第一列显示最大可能值,即a = Ntotal = initial_.s + initial_.i >= P = P.s + P.i + P.r
,所有除以scale
。
第二个 P.s + P.i + P.r
列有时比第一个 Ntotal
列短,因为多个整数除法(scale = round(Ntotal/10)
和 b, c, d = round(P.(s, i, r)/scale)
)引入了截断错误。
你不能完全解决这个问题,但你可以通过扩大比例来改善表示,即通过减少 scale
参数,这会延长列的长度(它们最终会包含更多 #
).
您正在对行进行整数除法
int scale = round(Ntotal/10) ;
std::string a(Ntotal/scale,'#') ;
std::string b(round(P.s/scale),'#') ;
std::string c(round(P.i/scale),'#') ;
std::string d(round(P.r/scale),'#') ;
并且余数被截断,因此此处使用的 round()
未按预期工作。
你可以(A + B/2) / B
对两个正整数A / B
的除法结果进行四舍五入,所以行应该是
int scale = (Ntotal+5)/10 ;
std::string a(Ntotal/scale,'#') ;
std::string b((P.s+scale/2)/scale,'#') ;
std::string c((P.i+scale/2)/scale,'#') ;
std::string d((P.r+scale/2)/scale,'#') ;
我正在尝试在标准输出中编写图表,程序 returns 行“#”应该在另一个函数更改它们后加起来等于初始数量。我保证修改数字的函数没有错误。这是我的代码:
struct mystruct {
long long int s;
long long int i;
long long int r;
}
mystruct initial_;
void draw_row(mystruct P)
{
long long int Ntotal = initial_.s + initial_.i;
int scale = round(Ntotal / 10);
std::string a(Ntotal / scale, '#');
std::string b(round(P.s / scale), '#');
std::string c(round(P.i / scale), '#');
std::string d(round(P.r / scale), '#');
std::cout << P.s << " " << P.i << " " << P.r << '\n';
std::cout << scale << '\n';
std::cout << a << '\n' << b << c << d << '\n';
}
这些是它的一些输出示例:
499 1 0
##########
#########
0 450 50
##########
##########
0 249 251
##########
#########
我取第一列显示最大可能值,即a = Ntotal = initial_.s + initial_.i >= P = P.s + P.i + P.r
,所有除以scale
。
第二个 P.s + P.i + P.r
列有时比第一个 Ntotal
列短,因为多个整数除法(scale = round(Ntotal/10)
和 b, c, d = round(P.(s, i, r)/scale)
)引入了截断错误。
你不能完全解决这个问题,但你可以通过扩大比例来改善表示,即通过减少 scale
参数,这会延长列的长度(它们最终会包含更多 #
).
您正在对行进行整数除法
int scale = round(Ntotal/10) ;
std::string a(Ntotal/scale,'#') ;
std::string b(round(P.s/scale),'#') ;
std::string c(round(P.i/scale),'#') ;
std::string d(round(P.r/scale),'#') ;
并且余数被截断,因此此处使用的 round()
未按预期工作。
你可以(A + B/2) / B
对两个正整数A / B
的除法结果进行四舍五入,所以行应该是
int scale = (Ntotal+5)/10 ;
std::string a(Ntotal/scale,'#') ;
std::string b((P.s+scale/2)/scale,'#') ;
std::string c((P.i+scale/2)/scale,'#') ;
std::string d((P.r+scale/2)/scale,'#') ;