Advertisement
a53

Egaltati

a53
Dec 6th, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstring>
  3. using namespace std;
  4. int V[26],n,uz[26];
  5. char S[100][31];
  6.  
  7. int parsare(char *s);
  8. void determinare(int p);
  9.  
  10. int parsare(char *s)
  11. {
  12. /// sirul s poate fi A op B, op = +, *, sau s poate fi A
  13. /// A,B pot fi litere sau numere naturale
  14. char * p,op;
  15. int startA=0,startB; /// pozitia de start pentru A, respectiv B
  16. /// determinam tipul operatiei
  17. p=strchr(s,'+');
  18. if(p)
  19. op='+',startB=p-s+1;
  20. else
  21. {
  22. p=strchr(s,'*');
  23. if(p)
  24. op='*',startB=p-s+1;
  25. else
  26. op=0; /// nu avem operatie
  27. }
  28. int A,B;
  29. /// determinam valoarea lui A
  30. int i=startA;
  31. while(s[i]==' ')
  32. ++i;
  33. if(s[i]>='a'&&s[i]<='z')
  34. if(uz[s[i]-'a'])
  35. A=V[s[i]-'a'];
  36. else
  37. {
  38. determinare(s[i]-'a');
  39. A=V[s[i]-'a'];
  40. }
  41. else
  42. {
  43. A=0;
  44. while((s[i]>='0'&&s[i]<='9'))
  45. A=10*A+s[i]-'0',++i;
  46. }
  47. if(op!=0)
  48. {
  49. /// determinam valoarea lui B
  50. i=startB;
  51. while(s[i]==' ')
  52. ++i;
  53. if(s[i]>='a'&&s[i]<='z')
  54. if(uz[s[i]-'a'])
  55. B=V[s[i]-'a'];
  56. else
  57. {
  58. determinare(s[i]-'a');
  59. B=V[s[i]-'a'];
  60. }
  61. else
  62. {
  63. B=0;
  64. while((s[i]>='0'&&s[i]<='9'))
  65. B=10*B+s[i]-'0',++i;
  66. }
  67. if(op=='+')
  68. A+=B;
  69. else
  70. A*=B;
  71. }
  72. return A;
  73. }
  74.  
  75. void determinare(int p)
  76. {
  77. if(uz[p])
  78. return ;
  79. char L='a'+p;
  80. for(int i = 1 ; i <= n ; i ++)
  81. if(S[i][0] == L)
  82. {
  83. uz[p]=1;
  84. int j=0;
  85. while(S[i][j]!='=')
  86. ++j;
  87. ++j;
  88. while(S[i][j]==' ')
  89. ++j;
  90. V[p]=parsare(S[i]+j);
  91. return;
  92. }
  93. }
  94.  
  95. int main()
  96. {
  97. ifstream f("egalitati.in");
  98. f>>n;
  99. f.getline(S[0],31);
  100. for(int i=1;i<=n;++i)
  101. f.getline(S[i],31);
  102. f.close();
  103. for(int i=0;i<26;++i)
  104. determinare(i);
  105. ofstream g("egalitati.out");
  106. for(int i=0;i<26;++i)
  107. if(uz[i])
  108. g<<(char)('a'+i)<<" = "<<V[i]<<'\n';
  109. g.close();
  110. return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement