下面是一段分数计算的Qt代码,运行后显示界面,在界面上不管输入什么,运算结果在输出框中都是0,是代码有什么问题吗?
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>
const int MainWindow::MAX_INPUT_LENGTH;
Fraction::Fraction(int num, int den) : numerator(num), denominator(den) {
if (denominator == 0) {
numerator = 0;
denominator = 1;
}
}
Fraction Fraction::operator+(const Fraction& other) const {
int jiaDen = denominator * other.denominator;
int jiaNum = numerator * other.denominator + other.numerator * denominator;
return Fraction(jiaNum, jiaDen).simplified();
}
Fraction Fraction::operator-(const Fraction& other) const {
int commonDen = denominator * other.denominator;
int commonNum = numerator * other.denominator - other.numerator * denominator;
return Fraction(commonNum, commonDen).simplified();
}
Fraction Fraction::operator*(const Fraction& other) const {
int chengNum = numerator * other.numerator;
int chengDen = denominator * other.denominator;
return Fraction(chengNum, chengDen).simplified();
}
Fraction Fraction::operator/(const Fraction& other) const {
if (other.numerator == 0) {
// 除数为零
throw std::invalid_argument("Division by zero!");
}
int newNum = numerator * other.denominator;
int newDen = denominator * other.numerator;
return Fraction(newNum, newDen).simplified();
}
Fraction Fraction::simplified() const {
int gcd = 1;
for (int i = 2; i <= std::min(numerator, denominator); i++) {
if (numerator % i == 0 && denominator % i == 0) {
gcd = i;
}
}
return Fraction(numerator / gcd, denominator / gcd);
}
Fraction MainWindow::parseFraction(const QString &input) {
QStringList parts = input.split('/');
int numerator = parts[0].toInt();
int denominator = (parts.size() > 1) ? parts[1].toInt() : 1;
return Fraction(numerator, denominator);
}
QString Fraction::toString() const {
if (denominator == 1) {
return QString::number(numerator);
}
else {
return QString::number(numerator) + "/" + QString::number(denominator);
}
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow), operand1(0, 1), operand2(0,1)
{
ui->setupUi(this);
connect(ui->numberButton_0, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_1, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_2, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_3, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_4, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_5, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_6, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_7, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_8, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->numberButton_9, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
connect(ui->plusButton, SIGNAL(clicked()), this, SLOT(on_plusButton_clicked()));
connect(ui->minusButton, SIGNAL(clicked()), this, SLOT(on_minusButton_clicked()));
connect(ui->multiplyButton, SIGNAL(clicked()), this, SLOT(on_multiplyButton_clicked()));
connect(ui->divideButton, SIGNAL(clicked()), this, SLOT(on_divideButton_clicked()));
connect(ui->fractionLineButton, SIGNAL(clicked()), this, SLOT(on_fractionLineButton_clicked()));
connect(ui->equalButton, SIGNAL(clicked()), this, SLOT(on_equalButton_clicked()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_numberButton_clicked()
{
QPushButton* button = qobject_cast<QPushButton*>(sender());
QString number = button->text();
appendToInput(number);
}
void MainWindow::on_plusButton_clicked()
{
operand1 = parseFraction(currentNumber);
currentOperator = "+";
clearInput();
setOutput("");
}
void MainWindow::on_minusButton_clicked()
{
operand1 = parseFraction(currentNumber);
currentOperator = "-";
clearInput();
setOutput("");
}
void MainWindow::on_multiplyButton_clicked()
{
operand1 = parseFraction(currentNumber);
currentOperator = "*";
clearInput();
setOutput("");
}
void MainWindow::on_divideButton_clicked()
{
operand1 = parseFraction(currentNumber);
currentOperator = "/";
clearInput();
setOutput("");
}
void MainWindow::on_fractionLineButton_clicked()
{
// 获取当前输入框的内容
QString input = currentNumber;
// 如果输入框为空,或者以非数字字符结尾(例如已经存在一个“/”),
// 则不需要添加分数线
if (input.isEmpty() || !input.back().isDigit()) {
return;
}
// 添加分数线
appendToInput("/");
}
void MainWindow::on_equalButton_clicked()
{
try {
operand2 = parseFraction(currentNumber);
clearInput();
calculateResult();
}
catch (const std::invalid_argument& e) {
setOutput(QString::fromStdString(e.what()));
}
}
void MainWindow::appendToInput(QString number)
{
if (currentNumber.length() >= MAX_INPUT_LENGTH) {
return;
}
currentNumber.append(number);
setInput(currentNumber);
}
void MainWindow::clearInput()
{
currentNumber.clear();
setInput("");
}
void MainWindow::clearOutput()
{
setOutput("");
}
void MainWindow::setInput(QString input) {
ui->inputLineEdit->setText(input);
currentNumber = input;
}
void MainWindow::setOutput(QString output) {
ui->outputLineEdit->setText(output);
}
void MainWindow::calculateResult() {
Fraction result;
QString output;
if (currentOperator == "+") {
result = operand1 + operand2;
}
else if (currentOperator == "-") {
result = operand1 - operand2;
}
else if (currentOperator == "*") {
result = operand1 * operand2;
}
else if (currentOperator == "/") {
result = operand1 / operand2;
}
output = result.toString();
setOutput(output);
}
看你等于按钮事件处理
你的 MAX_INPUT_LENGTH 没有赋值 看着是静态变量那就是0, 一直解析各个分数各个数都是0 ,所以无论怎样算都是 0。
你给个值 10 比如
const int MainWindow::MAX_INPUT_LENGTH = 10;
xxxxxxx.cpp:1627: error: ‘sdk’ was not declared in this scope
,顾名思义,未声明,往往就是找不到头文件导致。xxxxxxx.cpp:1624: error: undefined reference to
这一类报错,顾名思义,未定义,往往是找不到库文件导致。