我正在处理的代码片段旨在创建一个包含104列和行的电子表格。您可以猜测列标题会增加字母表。在Z字母之后,你有AA到AZ等等。
现在我测试的事实是,在Z之后,代码从A到Z循环,直到填充104列标题。
以下是代码:
#include "spreadhall.h"
#include <cmath>
SpreadWnd::SpreadWnd()
{
formulaInput = new QLineEdit;
table = new QTableWidget;
table->setRowCount(104); // int row = table->rowCount();
table->setColumnCount(104); int col = table->columnCount();
table->setSizeAdjustPolicy(QTableWidget::AdjustToContents);
QString s[26] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
QString str = "";
for(int i = 0; i < col; i++)
{
//int r = (i + 1) % 26;
if(i > 25)
{
int q;
int r = remquo(i, 25, &q);
if(r == 0) r = 25;
str = s[r - 1];
}
else
str = s[i];
table->setHorizontalHeaderItem(i, new QTableWidgetItem(str));
}
vLay = new QVBoxLayout;
vLay->addWidget(formulaInput);
vLay->addWidget(table);
this->setLayout(vLay);
}
For循环是编写标题的代码段。当我在 For循环的第一行使用注释中的代码时,一切正常,标题从A循环回Z.但是当我使用 remquo 函数时,我在运行时遇到断言失败。我不明白为什么。
有人知道出了什么问题吗?
N.B:
我没有使用余数函数,因为我需要商在Z之后设计AA等等。
我在Win8平台上的64位Acer笔记本电脑上使用Qt5.3和MSVC2013。
谢谢!
答案 0 :(得分:2)
您遇到的问题是remquo()
计算余数的方式的结果。如果您查看docs,您会看到:
除法运算的IEEE浮点余数x / y 通过这个函数计算的恰好是值x - n * y,其中 值n是最接近精确值x / y
的积分值
因此,对于某些值,商将向上四舍五入到下一个整数,从而得到余数的负值,即s
数组的负索引。
考虑例如remquo(13, 25, x)
。你明白了:
13 / 25 = 0.52
商数向上舍入为1
,结果为:
13 - 1 * 25 = -12
您可以使用div
代替remquo()
,它会返回预期值:
div_t d = div(13, 25);
qDebug() << d.quot; // x / y --> 0
qDebug() << d.rem; // x % y --> 13