/////////////////////////////////////////////////////////////////////
// Quantum Calculator example (C++ version)
// Copyright (c) 2002 Miro Samek, Palo Alto, CA.
// All Rights Reserved.
/////////////////////////////////////////////////////////////////////
#include "qassert.h"
#include "calc1.h"
#include "resource.h"
#include <string.h>
#include <commctrl.h>
#include <stdio.h>
DEFINE_THIS_FILE;
enum { PRECISION = 14 };
static HINSTANCE locHinst; // this instance
static HWND locHwnd; // window handle
//-------------------------------------------------------------------
void Calc1::clear() {
myDisplay[0] = ' ';
myDisplay[1] = '0';
myDisplay[2] = '\0';
myIns = &myDisplay[1];
SetDlgItemText(myHwnd, IDC_DISPLAY, myDisplay);
}
//...................................................................
void Calc1::insert(int keyId) {
if (myIns < &myDisplay[PRECISION - 1]) {
*myIns++ = (keyId == IDC_POINT) ? '.' : keyId - IDC_0+'0';
*myIns = '\0';
SetDlgItemText(myHwnd, IDC_DISPLAY, myDisplay);
}
}
//...................................................................
void Calc1::negate() {
myDisplay[0] = '-';
SetDlgItemText(myHwnd, IDC_DISPLAY, myDisplay);
}
//...................................................................
void Calc1::eval() {
double r;
switch (myOperator) {
case IDC_PLUS:
r = myOperand1 + myOperand2;
break;
case IDC_MINUS:
r = myOperand1 - myOperand2;
break;
case IDC_MULT:
r = myOperand1 * myOperand2;
break;
case IDC_DIVIDE:
if (myOperand2 != 0.0) {
r = myOperand1 / myOperand2;
}
else {
MessageBox(myHwnd, "Cannot Divide by 0",
"Calculator", MB_OK);
r = 0.0;
}
break;
default:
ASSERT(0);
}
if (-1.0e10 < r && r < 1.0e10) {
sprintf(myDisplay, "%24.11g", r);
}
else {
MessageBox(myHwnd, "Result out of range",
"Calculator", MB_OK);
clear();
}
SetDlgItemText(myHwnd, IDC_DISPLAY, myDisplay);
}
//...................................................................
void Calc1::dispState(char const *s) {
SetDlgItemText(myHwnd, IDC_STATE, s);
}
// HSM definition ---------------------------------------------------
void Calc1::initial(QEvent const *) {
Q_INIT(&Calc1::calc);
}
//...................................................................
QSTATE Calc1::final(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
EndDialog(myHwnd, 0);
return 0;
}
return (QSTATE)&Calc1::top;
}
//...................................................................
QSTATE Calc1::calc(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("calc");
return 0;
case Q_INIT_SIG:
clear();
Q_INIT(&Calc1::ready);
return 0;
case IDC_C:
clear();
Q_TRAN(&Calc1::calc);
return 0;
case TERMINATE:
Q_TRAN(&Calc1::final);
return 0;
}
if (e->sig >= Q_USER_SIG) {
isHandled = FALSE;
}
return (QSTATE)&Calc1::top;
}
//...................................................................
QSTATE Calc1::ready(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("ready");
return 0;
case Q_INIT_SIG:
Q_INIT(&Calc1::begin);
return 0;
case IDC_0:
clear();
Q_TRAN(&Calc1::zero1);
return 0;
case IDC_1_9:
clear();
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::int1);
return 0;
case IDC_POINT:
clear();
insert(IDC_0);
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::frac1);
return 0;
case IDC_OPER:
sscanf(myDisplay, "%lf", &myOperand1);
myOperator = ((CalcEvt *)e)->keyId;
Q_TRAN(&Calc1::opEntered);
return 0;
}
return (QSTATE)&Calc1::calc;
}
//...................................................................
QSTATE Calc1::result(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("result");
eval();
return 0;
}
return (QSTATE)&Calc1::ready;
}
//...................................................................
QSTATE Calc1::begin(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("begin");
return 0;
case IDC_OPER:
if (((CalcEvt *)e)->keyId == IDC_MINUS) {
Q_TRAN(&Calc1::negated1);
return 0; // event handled
}
else if (((CalcEvt *)e)->keyId == IDC_PLUS) { // unary "+"
return 0; // event handled
}
break; // event unhandled!
}
return (QSTATE)&Calc1::ready;
}
//...................................................................
QSTATE Calc1::negated1(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("negated1");
negate();
return 0;
case IDC_CE:
clear();
Q_TRAN(&Calc1::begin);
return 0;
case IDC_0:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::zero1);
return 0;
case IDC_1_9:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::int1);
return 0;
case IDC_POINT:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::frac1);
return 0;
}
return (QSTATE)&Calc1::calc;
}
//...................................................................
QSTATE Calc1::negated2(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("negated2");
negate();
return 0;
case IDC_CE:
Q_TRAN(&Calc1::opEntered);
return 0;
case IDC_0:
Q_TRAN(&Calc1::zero2);
return 0;
case IDC_1_9:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::int2);
return 0;
case IDC_POINT:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::frac2);
return 0;
}
return (QSTATE)&Calc1::calc;
}
//...................................................................
QSTATE Calc1::operand1(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("operand1");
return 0;
case IDC_CE:
clear();
Q_TRAN(&Calc1::begin);
return 0;
case IDC_OPER:
sscanf(myDisplay, "%lf", &myOperand1);
myOperator = ((CalcEvt *)e)->keyId;
Q_TRAN(&Calc1::opEntered);
return 0;
}
return (QSTATE)&Calc1::calc;
}
//...................................................................
QSTATE Calc1::zero1(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("zero1");
return 0;
case IDC_1_9:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::int1);
return 0;
case IDC_POINT:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::frac1);
return 0;
}
return (QSTATE)&Calc1::operand1;
}
//...................................................................
QSTATE Calc1::int1(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("int1");
return 0;
case IDC_0:
case IDC_1_9:
insert(((CalcEvt *)e)->keyId);
return 0;
case IDC_POINT:
insert(((CalcEvt *)e)->keyId);
Q_TRAN(&Calc1::frac1);
return 0;
}
return (QSTATE)&Calc1::operand1;
}
//...................................................................
QSTATE Calc1::frac1(QEvent const *e) {
switch (e->sig) {
case Q_ENTRY_SIG:
dispState("frac1");
return 0;
case IDC_0:
case IDC_1_9:
insert(((CalcEvt *)e)->keyId);
return 0;
}
return (QSTATE)&Calc1::operand1;
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Cpp.zip_量子_量子框架_量子计算 (720个子文件)
comp.aps 34KB
Calc2.aps 34KB
Calc0.aps 34KB
Calc1.aps 34KB
Calc.aps 34KB
reminder.aps 32KB
defer.aps 18KB
test.asm 909B
test2.asm 810B
QF_DOS.BSC 30KB
QDPP.BSC 22KB
Qdpp.cfg 3KB
Qdpp.cfg 3KB
Qdpp.cfg 3KB
calc1.cpp 12KB
calc.cpp 12KB
calc0.cpp 10KB
Qf.cpp 8KB
defer1.cpp 7KB
Qhsm.cpp 7KB
defer.cpp 6KB
comp1.cpp 6KB
comp.cpp 6KB
reminder1.cpp 6KB
comp2.cpp 6KB
reminder.cpp 5KB
Qhsmtst1.cpp 5KB
Qhsmtst3.cpp 5KB
Qhsmtst.cpp 5KB
Qhsmtst2.cpp 5KB
history.cpp 5KB
Qdpp.cpp 4KB
Qequeue.cpp 4KB
Win32.cpp 4KB
RTT32.cpp 4KB
Dos.cpp 4KB
Dos.cpp 4KB
Qdpp.cpp 4KB
QhsmTran.cpp 3KB
Qdpp.cpp 3KB
RTK32a.cpp 3KB
RTK32.cpp 3KB
main.cpp 3KB
RTK32.cpp 3KB
hook.cpp 3KB
main.cpp 3KB
main.cpp 3KB
alarm2.cpp 3KB
alarm1.cpp 2KB
Qtimer.cpp 2KB
Qepool.cpp 2KB
alarm.cpp 2KB
Cparser6.cpp 2KB
main.cpp 2KB
main.cpp 2KB
Cparser5.cpp 2KB
Cparser4.cpp 2KB
Cparser1.cpp 2KB
Cparser8.cpp 2KB
main.cpp 1KB
main.cpp 1KB
main.cpp 1KB
Test6.cpp 1KB
Cparser3.cpp 1KB
Test5.cpp 1KB
calc2.cpp 1KB
Test8.cpp 1KB
Test2.cpp 1KB
Test7.cpp 1KB
Test4.cpp 1KB
Test1.cpp 1KB
Test3.cpp 1KB
Cparser7.cpp 1KB
Cparser2.cpp 1005B
test.cpp 691B
test2.cpp 680B
Qactive.cpp 551B
inst0.cpp 357B
inst1.cpp 357B
inst2.cpp 357B
inst.cpp 353B
Qfsm.cpp 348B
CLRFILE.CV4 211B
mt.dep 67B
QDPP.DSK 3KB
QF_DOS.DSK 3KB
Qdpp.dsp 5KB
Qdpp.dsp 5KB
cparser2.dsp 5KB
Qdpp.dsp 5KB
cparser6.dsp 5KB
Qdpp.dsp 5KB
Qdpp.dsp 5KB
Qdpp.dsp 5KB
cparser8.dsp 5KB
cparser7.dsp 5KB
cparser5.dsp 4KB
reminder1.dsp 4KB
QHsmTst2.dsp 4KB
QHsmTst3.dsp 4KB
共 720 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
- Hierophant012022-12-20非常有用的资源,有一定的参考价值,受益匪浅,值得下载。
weixin_42653672
- 粉丝: 94
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功