#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
struct argList{ double * refVar; double val; } ;
class Machine {
typedef void ( Machine:: * oper) ( void ) ;
double a,b;
int NN,counter;
oper* funcStack;
argList* funcArgs;
public :
Machine( ) { a= 0 ; b= 0 ; NN= 0 ; funcArgs= NULL ; funcStack= NULL ; } ;
Machine( int NN) : counter( 0 ) {
a= 0 ; b= 0 ; funcArgs= NULL ; funcStack= NULL ;
this- > NN= NN; if ( ! funcArgs) funcArgs= new argList[ NN] ;
if ( ! funcStack) funcStack= new oper[ NN] ; } ;
~Machine( ) {
if ( funcArgs) delete funcArgs;
if ( funcStack) delete funcStack;
} ;
void meanArifGeom( void ) {
double x= 0.5 * ( a+ b) ;
double y= sqrt ( a* b) ;
a= x; b= y;
printf ( "x = %.10f y = %.10f\n " ,a,b) ;
return ;
} ;
void setVar( void ) {
argList* reff= & ( funcArgs[ counter] ) ;
* ( reff- > refVar) = reff- > val;
return ;
} ;
void eval( char * ev) {
char s1[ 80 ] ; double s2;
char * eq= strstr ( ev,"=" ) ;
strncpy ( s1,ev,( int ) ( eq- ev) ) ; s1[ ( int ) ( eq- ev) ] = 0 ;
s2= atof ( eq+ 1 ) ;
funcStack[ counter] = & Machine:: setVar ;
argList* curr= & ( this- > funcArgs[ counter] ) ;
if ( ! strcmp ( s1,"a" ) ) { curr- > refVar= & a; } else { curr- > refVar= & b; }
curr- > val= s2; counter++ ;
return ;
} ;
void calc( void ) {
funcStack[ counter] = & Machine:: meanArifGeom ;
counter++ ;
} ;
void runMachine( void ) {
int maxcount= counter; counter= 0 ;
while ( counter< maxcount) { ( this- > * funcStack[ counter] ) ( ) ; counter++ ; }
} ;
void showState( void ) {
printf ( "a = %.10f b = %.10f\n " ,a,b) ;
} ;
void setDirect( double x,double y) { a= x; b= y; } ;
void showCount( void ) {
printf ( "c = %d\n " ,counter) ;
} ;
} ;
int main( void )
{
Machine mmm= Machine( 10 ) ;
mmm.eval ( "a=5" ) ; mmm.eval ( "b=17" ) ;
mmm.calc ( ) ; mmm.calc ( ) ; mmm.calc ( ) ; mmm.calc ( ) ; mmm.calc ( ) ; mmm.calc ( ) ;
mmm.runMachine ( ) ;
mmm.showState ( ) ;
return 0 ;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCgpzdHJ1Y3QgYXJnTGlzdHtkb3VibGUqIHJlZlZhcjsgZG91YmxlIHZhbDt9OwoKCmNsYXNzIE1hY2hpbmUgewoJdHlwZWRlZiB2b2lkIChNYWNoaW5lOjoqb3Blcikodm9pZCk7Cglkb3VibGUgYSxiOwoJaW50IE5OLGNvdW50ZXI7CglvcGVyKiBmdW5jU3RhY2s7CglhcmdMaXN0KiBmdW5jQXJnczsKCnB1YmxpYzoKCU1hY2hpbmUoKSB7YT0wO2I9MDtOTj0wO2Z1bmNBcmdzPU5VTEw7ZnVuY1N0YWNrPU5VTEw7fTsKCU1hY2hpbmUoaW50IE5OKTpjb3VudGVyKDApIHsKCQlhPTA7Yj0wO2Z1bmNBcmdzPU5VTEw7ZnVuY1N0YWNrPU5VTEw7CgkJdGhpcy0+Tk49Tk47aWYoIWZ1bmNBcmdzKSBmdW5jQXJncz1uZXcgYXJnTGlzdFtOTl07CgkgICAgaWYoIWZ1bmNTdGFjaykgZnVuY1N0YWNrPW5ldyBvcGVyW05OXTt9OwoJfk1hY2hpbmUoKSB7CgkJaWYoZnVuY0FyZ3MpIGRlbGV0ZSBmdW5jQXJnczsKCQlpZihmdW5jU3RhY2spIGRlbGV0ZSBmdW5jU3RhY2s7Cgl9OwoJCgl2b2lkIG1lYW5BcmlmR2VvbSh2b2lkKSB7CgkJZG91YmxlIHg9MC41KihhK2IpOwoJCWRvdWJsZSB5PXNxcnQoYSpiKTsKCQlhPXg7Yj15OwoJCXByaW50ZigieCA9ICUuMTBmICB5ID0gJS4xMGZcbiIsYSxiKTsKCQlyZXR1cm47Cgl9OwoKCXZvaWQgc2V0VmFyKHZvaWQpIHsKCQlhcmdMaXN0KiByZWZmPSYoZnVuY0FyZ3NbY291bnRlcl0pOwoJCSoocmVmZi0+cmVmVmFyKT1yZWZmLT52YWw7CgkJcmV0dXJuOwoJfTsKCXZvaWQgZXZhbChjaGFyKiBldikgewoJCWNoYXIgczFbODBdO2RvdWJsZSBzMjsKCQljaGFyKiBlcT1zdHJzdHIoZXYsIj0iKTsKCQlzdHJuY3B5KHMxLGV2LChpbnQpKGVxLWV2KSk7czFbKGludCkoZXEtZXYpXT0wOwoJCXMyPWF0b2YoZXErMSk7CgkJZnVuY1N0YWNrW2NvdW50ZXJdPSZNYWNoaW5lOjpzZXRWYXI7CgkJYXJnTGlzdCogY3Vycj0mKHRoaXMtPmZ1bmNBcmdzW2NvdW50ZXJdKTsKCQlpZighc3RyY21wKHMxLCJhIikpIHtjdXJyLT5yZWZWYXI9JmE7fSBlbHNlIHtjdXJyLT5yZWZWYXI9JmI7fQoJCWN1cnItPnZhbD1zMjtjb3VudGVyKys7CgkJcmV0dXJuOwoJfTsKCXZvaWQgY2FsYyh2b2lkKSB7CgkJZnVuY1N0YWNrW2NvdW50ZXJdPSZNYWNoaW5lOjptZWFuQXJpZkdlb207CgkJY291bnRlcisrOwoJfTsKCXZvaWQgcnVuTWFjaGluZSh2b2lkKSB7CgkJaW50IG1heGNvdW50PWNvdW50ZXI7Y291bnRlcj0wOwoJCXdoaWxlKGNvdW50ZXI8bWF4Y291bnQpIHsodGhpcy0+KmZ1bmNTdGFja1tjb3VudGVyXSkoKTtjb3VudGVyKys7fQoJfTsKCXZvaWQgc2hvd1N0YXRlKHZvaWQpIHsKCQlwcmludGYoImEgPSAlLjEwZiAgYiA9ICUuMTBmXG4iLGEsYik7Cgl9OwoJdm9pZCBzZXREaXJlY3QoZG91YmxlIHgsZG91YmxlIHkpIHthPXg7Yj15O307Cgl2b2lkIHNob3dDb3VudCh2b2lkKSB7CgkJcHJpbnRmKCJjID0gJWRcbiIsY291bnRlcik7Cgl9Owp9OwoKCmludCBtYWluKHZvaWQpCnsKCglNYWNoaW5lIG1tbT1NYWNoaW5lKDEwKTsKCW1tbS5ldmFsKCJhPTUiKTttbW0uZXZhbCgiYj0xNyIpOwoJbW1tLmNhbGMoKTttbW0uY2FsYygpO21tbS5jYWxjKCk7bW1tLmNhbGMoKTttbW0uY2FsYygpO21tbS5jYWxjKCk7CgltbW0ucnVuTWFjaGluZSgpOwoJbW1tLnNob3dTdGF0ZSgpOwoKCXJldHVybiAwOwp9Cgo=