just a sample of what can be done

Dependencies:   mbed

PRN電卓プログラム

「プログラミング言語C (K&R本)」に出てくる例を元にした,RPN計算機です.

hp写真はイメージです

このプログラムは..

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?

UserRevisionLine numberNew 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