fork(3) download
  1.  
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. struct argList{double* refVar; double val;};
  9.  
  10.  
  11. class Machine {
  12. typedef void (Machine::*oper)(void);
  13. double a,b;
  14. int NN,counter;
  15. oper* funcStack;
  16. argList* funcArgs;
  17.  
  18. public:
  19. Machine() {a=0;b=0;NN=0;funcArgs=NULL;funcStack=NULL;};
  20. Machine(int NN):counter(0) {
  21. a=0;b=0;funcArgs=NULL;funcStack=NULL;
  22. this->NN=NN;if(!funcArgs) funcArgs=new argList[NN];
  23. if(!funcStack) funcStack=new oper[NN];};
  24. ~Machine() {
  25. if(funcArgs) delete funcArgs;
  26. if(funcStack) delete funcStack;
  27. };
  28.  
  29. void meanArifGeom(void) {
  30. double x=0.5*(a+b);
  31. double y=sqrt(a*b);
  32. a=x;b=y;
  33. printf("x = %.10f y = %.10f\n",a,b);
  34. return;
  35. };
  36.  
  37. void setVar(void) {
  38. argList* reff=&(funcArgs[counter]);
  39. *(reff->refVar)=reff->val;
  40. return;
  41. };
  42. void eval(char* ev) {
  43. char s1[80];double s2;
  44. char* eq=strstr(ev,"=");
  45. strncpy(s1,ev,(int)(eq-ev));s1[(int)(eq-ev)]=0;
  46. s2=atof(eq+1);
  47. funcStack[counter]=&Machine::setVar;
  48. argList* curr=&(this->funcArgs[counter]);
  49. if(!strcmp(s1,"a")) {curr->refVar=&a;} else {curr->refVar=&b;}
  50. curr->val=s2;counter++;
  51. return;
  52. };
  53. void calc(void) {
  54. funcStack[counter]=&Machine::meanArifGeom;
  55. counter++;
  56. };
  57. void runMachine(void) {
  58. int maxcount=counter;counter=0;
  59. while(counter<maxcount) {(this->*funcStack[counter])();counter++;}
  60. };
  61. void showState(void) {
  62. printf("a = %.10f b = %.10f\n",a,b);
  63. };
  64. void setDirect(double x,double y) {a=x;b=y;};
  65. void showCount(void) {
  66. printf("c = %d\n",counter);
  67. };
  68. };
  69.  
  70.  
  71. int main(void)
  72. {
  73.  
  74. Machine mmm=Machine(10);
  75. mmm.eval("a=5");mmm.eval("b=17");
  76. mmm.calc();mmm.calc();mmm.calc();mmm.calc();mmm.calc();mmm.calc();
  77. mmm.runMachine();
  78. mmm.showState();
  79.  
  80. return 0;
  81. }
  82.  
  83.  
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
x = 11.0000000000  y = 9.2195444573
x = 10.1097722286  y = 10.0705009324
x = 10.0901365805  y = 10.0901174748
x = 10.0901270277  y = 10.0901270277
x = 10.0901270277  y = 10.0901270277
x = 10.0901270277  y = 10.0901270277
a = 10.0901270277  b = 10.0901270277