Tedd OKANO
/
RPN_calc__based_on_K_and_R
just a sample of what can be done
PRN電卓プログラム
「プログラミング言語C (K&R本)」に出てくる例を元にした,RPN計算機です.
写真はイメージです
このプログラムは..
- 『mbed祭り 2015@初夏の東銀座』の親睦会で「RPN」と題して行ったLT(LightningTalk)でのデモ・プログラムです.
- mbed LPC1768,mbed LPC1114FN28で実行できることを確認しています(たぶん他のプラットフォームでも動きます)
- プレゼンスライドを置いておきます
main.cpp@5:3b9daee5f734, 2015-06-27 (annotated)
- Committer:
- okano
- Date:
- Sat Jun 27 01:29:21 2015 +0000
- Revision:
- 5:3b9daee5f734
- Parent:
- 3:4ef74510cc5b
functions "power" and "drop" are added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 0:6be9f112093f | 1 | #include "mbed.h" |
okano | 2:0e96f4495b43 | 2 | #include "calc.h" |
okano | 0:6be9f112093f | 3 | |
okano | 0:6be9f112093f | 4 | #define MAXOP 100 |
okano | 0:6be9f112093f | 5 | |
okano | 0:6be9f112093f | 6 | int main() |
okano | 0:6be9f112093f | 7 | { |
okano | 0:6be9f112093f | 8 | int type; |
okano | 0:6be9f112093f | 9 | double op2; |
okano | 0:6be9f112093f | 10 | char s[ MAXOP ]; |
okano | 3:4ef74510cc5b | 11 | int stack_dump; |
okano | 0:6be9f112093f | 12 | |
okano | 0:6be9f112093f | 13 | while ( (type = getop( s )) != EOF ) { |
okano | 3:4ef74510cc5b | 14 | stack_dump = 1; |
okano | 3:4ef74510cc5b | 15 | |
okano | 0:6be9f112093f | 16 | switch( type ) { |
okano | 0:6be9f112093f | 17 | case NUMBER: |
okano | 0:6be9f112093f | 18 | push( atof( s ) ); |
okano | 3:4ef74510cc5b | 19 | stack_dump = 0; |
okano | 0:6be9f112093f | 20 | break; |
okano | 0:6be9f112093f | 21 | case '+': |
okano | 0:6be9f112093f | 22 | push( pop() + pop() ); |
okano | 0:6be9f112093f | 23 | break; |
okano | 0:6be9f112093f | 24 | case '*': |
okano | 0:6be9f112093f | 25 | push( pop() * pop() ); |
okano | 0:6be9f112093f | 26 | break; |
okano | 0:6be9f112093f | 27 | case '-': |
okano | 0:6be9f112093f | 28 | op2 = pop(); |
okano | 0:6be9f112093f | 29 | push( pop() - op2 ); |
okano | 0:6be9f112093f | 30 | break; |
okano | 0:6be9f112093f | 31 | case '/': |
okano | 0:6be9f112093f | 32 | op2 = pop(); |
okano | 0:6be9f112093f | 33 | if ( op2 != 0.0 ) |
okano | 0:6be9f112093f | 34 | push( pop() / op2 ); |
okano | 3:4ef74510cc5b | 35 | else { |
okano | 0:6be9f112093f | 36 | printf( "error: zero divisor\n" ); |
okano | 3:4ef74510cc5b | 37 | stack_dump = 0; |
okano | 3:4ef74510cc5b | 38 | } |
okano | 0:6be9f112093f | 39 | break; |
okano | 5:3b9daee5f734 | 40 | case 'p': |
okano | 5:3b9daee5f734 | 41 | op2 = pop(); |
okano | 5:3b9daee5f734 | 42 | push( pow( pop(), op2 ) ); |
okano | 5:3b9daee5f734 | 43 | break; |
okano | 5:3b9daee5f734 | 44 | case 'd': |
okano | 5:3b9daee5f734 | 45 | pop(); |
okano | 5:3b9daee5f734 | 46 | break; |
okano | 0:6be9f112093f | 47 | case '\n': |
okano | 1:eb37ff1cb458 | 48 | break; |
okano | 1:eb37ff1cb458 | 49 | case 0x0D: |
okano | 1:eb37ff1cb458 | 50 | // just ignore |
okano | 3:4ef74510cc5b | 51 | stack_dump = 0; |
okano | 0:6be9f112093f | 52 | break; |
okano | 0:6be9f112093f | 53 | default: |
okano | 0:6be9f112093f | 54 | printf( "error: unknown command %s (0x%02X)\n", s, *s ); |
okano | 3:4ef74510cc5b | 55 | stack_dump = 0; |
okano | 0:6be9f112093f | 56 | break; |
okano | 0:6be9f112093f | 57 | } |
okano | 3:4ef74510cc5b | 58 | |
okano | 3:4ef74510cc5b | 59 | if ( stack_dump ) |
okano | 3:4ef74510cc5b | 60 | show_stack(); |
okano | 0:6be9f112093f | 61 | } |
okano | 0:6be9f112093f | 62 | } |