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@1:eb37ff1cb458, 2015-06-26 (annotated)
- Committer:
- okano
- Date:
- Fri Jun 26 10:10:50 2015 +0000
- Revision:
- 1:eb37ff1cb458
- Parent:
- 0:6be9f112093f
- Child:
- 2:0e96f4495b43
fix for terminal code; keep shown value in stack
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 0:6be9f112093f | 1 | #include "mbed.h" |
okano | 0:6be9f112093f | 2 | |
okano | 0:6be9f112093f | 3 | #define MAXOP 100 |
okano | 0:6be9f112093f | 4 | #define NUMBER '0' |
okano | 0:6be9f112093f | 5 | |
okano | 0:6be9f112093f | 6 | int getop( char [] ); |
okano | 0:6be9f112093f | 7 | void push( double ); |
okano | 0:6be9f112093f | 8 | double pop( void ); |
okano | 0:6be9f112093f | 9 | |
okano | 0:6be9f112093f | 10 | int main() |
okano | 0:6be9f112093f | 11 | { |
okano | 0:6be9f112093f | 12 | int type; |
okano | 0:6be9f112093f | 13 | double op2; |
okano | 0:6be9f112093f | 14 | char s[ MAXOP ]; |
okano | 0:6be9f112093f | 15 | |
okano | 0:6be9f112093f | 16 | while ( (type = getop( s )) != EOF ) { |
okano | 0:6be9f112093f | 17 | switch( type ) { |
okano | 0:6be9f112093f | 18 | case NUMBER: |
okano | 0:6be9f112093f | 19 | push( atof( s ) ); |
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 | 0:6be9f112093f | 35 | else |
okano | 0:6be9f112093f | 36 | printf( "error: zero divisor\n" ); |
okano | 0:6be9f112093f | 37 | break; |
okano | 0:6be9f112093f | 38 | case '\n': |
okano | 1:eb37ff1cb458 | 39 | printf( " %.8g\n", op2 = pop() ); |
okano | 1:eb37ff1cb458 | 40 | push( op2 ); |
okano | 1:eb37ff1cb458 | 41 | break; |
okano | 1:eb37ff1cb458 | 42 | case 0x0D: |
okano | 1:eb37ff1cb458 | 43 | // just ignore |
okano | 0:6be9f112093f | 44 | break; |
okano | 0:6be9f112093f | 45 | default: |
okano | 0:6be9f112093f | 46 | printf( "error: unknown command %s (0x%02X)\n", s, *s ); |
okano | 0:6be9f112093f | 47 | break; |
okano | 0:6be9f112093f | 48 | } |
okano | 0:6be9f112093f | 49 | } |
okano | 0:6be9f112093f | 50 | } |
okano | 0:6be9f112093f | 51 | |
okano | 0:6be9f112093f | 52 | |
okano | 0:6be9f112093f | 53 | |
okano | 0:6be9f112093f | 54 | //=============== |
okano | 0:6be9f112093f | 55 | |
okano | 0:6be9f112093f | 56 | |
okano | 0:6be9f112093f | 57 | #define MAXVAL 100 |
okano | 0:6be9f112093f | 58 | |
okano | 0:6be9f112093f | 59 | int sp = 0; |
okano | 0:6be9f112093f | 60 | double val[ MAXVAL ]; |
okano | 0:6be9f112093f | 61 | |
okano | 0:6be9f112093f | 62 | void push( double f ) |
okano | 0:6be9f112093f | 63 | { |
okano | 0:6be9f112093f | 64 | if ( sp < MAXVAL ) |
okano | 0:6be9f112093f | 65 | val[ sp++ ] = f; |
okano | 0:6be9f112093f | 66 | else |
okano | 0:6be9f112093f | 67 | printf( "error: stack full, can't push %g\n", f ); |
okano | 0:6be9f112093f | 68 | } |
okano | 0:6be9f112093f | 69 | |
okano | 0:6be9f112093f | 70 | |
okano | 0:6be9f112093f | 71 | double pop( void ) |
okano | 0:6be9f112093f | 72 | { |
okano | 0:6be9f112093f | 73 | if ( sp > 0 ) |
okano | 0:6be9f112093f | 74 | return val[ --sp ]; |
okano | 0:6be9f112093f | 75 | else { |
okano | 0:6be9f112093f | 76 | printf( "error: stack empty\n" ); |
okano | 0:6be9f112093f | 77 | return 0.0; |
okano | 0:6be9f112093f | 78 | } |
okano | 0:6be9f112093f | 79 | } |
okano | 0:6be9f112093f | 80 | |
okano | 0:6be9f112093f | 81 | |
okano | 0:6be9f112093f | 82 | //=============== |
okano | 0:6be9f112093f | 83 | |
okano | 0:6be9f112093f | 84 | |
okano | 0:6be9f112093f | 85 | #include <ctype.h> |
okano | 0:6be9f112093f | 86 | int getch( void ); |
okano | 0:6be9f112093f | 87 | void ungetch( int ); |
okano | 0:6be9f112093f | 88 | |
okano | 0:6be9f112093f | 89 | int getop( char s[] ) |
okano | 0:6be9f112093f | 90 | { |
okano | 0:6be9f112093f | 91 | int i, c; |
okano | 0:6be9f112093f | 92 | |
okano | 0:6be9f112093f | 93 | while ( (s[ 0 ] = c = getch()) == ' ' || c == '\t' ) |
okano | 0:6be9f112093f | 94 | ; |
okano | 0:6be9f112093f | 95 | |
okano | 0:6be9f112093f | 96 | s[ 1 ] = '\0'; |
okano | 0:6be9f112093f | 97 | |
okano | 0:6be9f112093f | 98 | if ( !isdigit( c ) && c != '.' ) |
okano | 0:6be9f112093f | 99 | return c; |
okano | 0:6be9f112093f | 100 | |
okano | 0:6be9f112093f | 101 | i = 0; |
okano | 0:6be9f112093f | 102 | |
okano | 0:6be9f112093f | 103 | if ( isdigit( c ) ) |
okano | 0:6be9f112093f | 104 | while ( isdigit( s[ ++i ] = c = getch() ) ) |
okano | 0:6be9f112093f | 105 | ; |
okano | 0:6be9f112093f | 106 | |
okano | 0:6be9f112093f | 107 | if ( c == '.' ) |
okano | 0:6be9f112093f | 108 | while ( isdigit( s[ ++i ] = c = getch() ) ) |
okano | 0:6be9f112093f | 109 | ; |
okano | 0:6be9f112093f | 110 | |
okano | 0:6be9f112093f | 111 | s[ i ] = '\0'; |
okano | 0:6be9f112093f | 112 | |
okano | 0:6be9f112093f | 113 | |
okano | 0:6be9f112093f | 114 | if ( c != EOF ) |
okano | 0:6be9f112093f | 115 | ungetch( c ); |
okano | 0:6be9f112093f | 116 | |
okano | 0:6be9f112093f | 117 | return NUMBER; |
okano | 0:6be9f112093f | 118 | } |
okano | 0:6be9f112093f | 119 | |
okano | 0:6be9f112093f | 120 | |
okano | 0:6be9f112093f | 121 | //=============== |
okano | 0:6be9f112093f | 122 | |
okano | 0:6be9f112093f | 123 | |
okano | 0:6be9f112093f | 124 | #define BUFSIZE 100 |
okano | 0:6be9f112093f | 125 | |
okano | 0:6be9f112093f | 126 | char buf[ BUFSIZE ]; |
okano | 0:6be9f112093f | 127 | int bufp = 0; |
okano | 0:6be9f112093f | 128 | |
okano | 0:6be9f112093f | 129 | int getch( void ) |
okano | 0:6be9f112093f | 130 | { |
okano | 0:6be9f112093f | 131 | #if 1 |
okano | 0:6be9f112093f | 132 | int c; |
okano | 0:6be9f112093f | 133 | c = (bufp > 0) ? buf[ --bufp ] : getchar(); |
okano | 0:6be9f112093f | 134 | printf( "[%c]\r\n", c ); |
okano | 0:6be9f112093f | 135 | return c; |
okano | 0:6be9f112093f | 136 | #else |
okano | 0:6be9f112093f | 137 | return (bufp > 0) ? buf[ --bufp ] : getchar(); |
okano | 0:6be9f112093f | 138 | #endif |
okano | 0:6be9f112093f | 139 | } |
okano | 0:6be9f112093f | 140 | |
okano | 0:6be9f112093f | 141 | |
okano | 0:6be9f112093f | 142 | void ungetch( int c ) |
okano | 0:6be9f112093f | 143 | { |
okano | 0:6be9f112093f | 144 | if ( bufp >= BUFSIZE ) |
okano | 0:6be9f112093f | 145 | printf( "ungetch: too many characters\n" ); |
okano | 0:6be9f112093f | 146 | else |
okano | 0:6be9f112093f | 147 | buf[ bufp++ ] = c; |
okano | 0:6be9f112093f | 148 | } |
okano | 0:6be9f112093f | 149 |