首页| 论坛| 消息

标题:小算盤標準型的思路
作者:harold00124
日期:2016-10-30 01:14
内容:

小弟剛入職所以老闆還在考核我的學習能力
因為小弟還是個新手 剛接觸QT也只有1周的時間 C++基礎也很薄弱
上周做了一個簡單的四則運算計算機 被老闆講說我做的是垃圾根本沒有實用價值
要我在下周二前在做一個跟微軟小算盤標準型有同樣功能跟算數邏輯的計算器
並且要求我注意並且增加
1:16進制 10進制 2進制的互相轉換
2:能連續運算 像是能連續輸入1+2/3+4-5 並且遵從 /* >+-的執行規則
3:1/3=0.333333333後*3會回歸1 開根號開平方都比照辦理
4:基本的除錯1/0 要顯示出Error 除數不可為0等等(這個我有做出來
我自己看了QT本身提供的calcuator範例簡直看得一頭霧水 連他的運算式是怎麼完成的都看不太懂 而且他沒有透過ui檔新增button而是直接在主程式新增並且排程(這部分我有看懂是怎麼做的)但是我還是比較習慣在表單用ui直接手動增加元件....
我現在碰到幾個難關
進位的處理要怎麼做才不會卡到二次運算的輸出 我一般都是在按鍵1~9做自動進位*10 等到按下=之後才做
ui->lineEdit->setText(Qstring::number((A+B)/10)並且輸出答案(但是這樣我會卡到多次運算 只能做單次運算)
有辦法直接在lineEdit內輸入值後直接拿那些值來運算嗎?要怎麼把他轉為數值?
比方說我直接連續在理面輸入1+2/3+4-5然後我直接拿出來做運算?

下面是我參考的範例源碼 目前只看懂不到1/3而已
首先他頭文件有2個 我不懂為什麼會要弄到2個頭文件 我自己做的只有1個頭文件
#ifndef BUTTON_H
#define BUTTON_H
#include
//! [0]
class Button : public QToolButton
{
Q_OBJECT
public:
explicit Button(const QString &text, QWidget *parent = 0);
QSize sizeHint() const Q_DECL_OVERRIDE;
};
//! [0]
#endif
-------------------------------------------------------------------------------------------------------------------------
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include
QT_BEGIN_NAMESPACE
class QLineEdit;
QT_END_NAMESPACE
class Button;
//! [0]
class Calculator : public QWidget
{
Q_OBJECT
public:
Calculator(QWidget *parent = 0);
private slots:
void digitClicked();
void unaryO ..


#1 [harold00124 10-31 07:20]
可能問的太攏統了 真不好意思
我現在想在頭文件設定一祖Qstring的變數input
QString input;
然後主程式在pushbutton的信號槽部分設定
讓input變數先取得原先數字 用插入的方式讓我省去進位的問題 我看網路上的文章好像也都是這樣做的 怎麼到我這邊就沒辦法? 是我漏掉哪個地方嗎?
還是我搞錯了什麼?

void MainWindow::on_pushButton_2_clicked()//1
{
input=ui->lineEdit->text();
ui->lineEdit->setText(input+QString::number(1));
}
#2 回 harold00124 的帖子 [bran_lee 10-31 11:24]
harold00124:可能問的太攏統了 真不好意思
我現在想在頭文件設定一祖Qstring的變數input
QString input;
....... (2016-10-31 07:20) 
不太懂你要问的意思,你可以把你的输入和期望的输出写出来,这样比较容易理解。
前面你贴出的参考例子,其实思路挺简单的:
1、输入数字就把当前显示的数字后面加数字
2、输入一元操作符,就对当前显示的数字做一次相应的运算
3、输入加或减,就看前面的输入有没有未处理的操作符,如果有乘除,就先做乘除,再看是否有加减,再做加减,刚刚输入的加或减,就作为未处理的操作符
4、输入乘或除,和加减差不多
5、其他操作都很简单,略
6、计算过程中产生的结果,主要就是sumSoFar、factorSoFar 和operand 的切换,calculate函数中,加减用sumSoFar保存结果,乘除用factorSoFar保存结果。
7、sumSoFar和factorSoFar总是作为左操作数,operand 总是作为右操作数。
#3 [cycloveu 10-31 15:15]
写计算器 必须也得上 策略模式啊,加上模板 逼格就更高了
#4 [harold00124 11-01 12:10]
感謝大大的提點
現在已經變的比較看的懂了,雖然還是有些語法看不懂(C++能力太薄弱了)
不過整個邏輯過程對小弟來說還是蠻複雜的
但是因為小弟現在能力還不足 要按照自己邏輯憑空生出還是頗有難度

不過現在也沒時間給小弟搞懂下去了 現在只好使用copy大法 然後按照我對這個程式的理解下去做相對的修改
主要是我本身還是習慣直接從ui配合信號槽下去拉控件 還沒辦法像這個範例一樣直接從主文件就能生成一堆控件 太頭痛了
而且交作業給老闆也不能長的太像(被發現就跪了)

現在碰到的問題是進制轉換的部分
我自己弄是希望能讓radioButton 的3個按鍵可以隨意轉換2 10 16進制
寫出來10轉2或者轉16都可以 但是互轉就碰到問題 像是
10進制轉去2進制之後會變成1010 然後就轉不回去了
void MainWindow::on_radioButton_clicked()//2進制
{
int n;
QString str;
n=ui->lineEdit->text().toInt();
str.setNum(n,2);
ui->lineEdit->setText(str);
}
void MainWindow::on_radioButton_2_clicked()//10進制
{
int n;
QString str;
n=ui->lineEdit->text().toInt();
str.setNum(n,10);
ui->lineEdit->setText(str);
}
void MainWindow::on_radioButton_3_clicked()//16進制
{
int n;
QString str;
n=ui->lineEdit->text().toInt();
str.setNum(n,16);
ui->lineEdit->setText(str);
}
#5 回 harold00124 的帖子 [bran_lee 11-01 13:50]
harold00124:感謝大大的提點
現在已經變的比較看的懂了,雖然還是有些語法看不懂(C++能力太薄弱了)
不過整個邏輯過程對小弟來說還是蠻複雜的
但是因為小弟現在能力還不足 要按照自己邏輯憑空生出還是頗有難度

....... (2016-11-01 12:10) 
没事多看看文档,qt的文档还是很详细的,你用的toInt()有两个参数,其中有设置进制的参数,默认是10进制所以二进制转十进制出问题

<< 1 2 >> (1/2)

回复 发表
主题 版块