рдпрд╛рдВрдбреЗрдХреНрд╕ рдореЗрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХрд╛рд░реНрдп

рдпреИрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрдж рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЦреБрд▓реА рд░рд┐рдХреНрддрд┐рдпреЛрдВ рд╣реИрдВред рдХрдВрдкрдиреА рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдЕрдЪреНрдЫреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд▓рдЧрд╛рддрд╛рд░ рдХрдореА рд╣реЛ рд░рд╣реА рд╣реИред рдФрд░ рдЗрди рдкрджреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИред рдФрд░ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпреИрдВрдбреЗрдХреНрд╕ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрдбрд╝реА рдЖрдИрдЯреА рдХрдВрдкрдирд┐рдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рди рдХреЗрд╡рд▓ рдпреИрдВрдбреЗрдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реЗрдЦ рдЕрднреА рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЪрдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╛рдиреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрди рдЕрд╕реНрд╕реА рдкреНрд░рддрд┐рд╢рдд рдХрд░реНрдордЪрд╛рд░реА рдЬреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╡рд┐рдХрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЕрдХреНрд╕рд░ рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬрд╝рди рд╕рд┐рд╕реНрдЯрдо рдбреЗрд╡рд▓рдкрд░реНрд╕, рднрд╛рд╖рд╛рд╡рд┐рдж, рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░реЗрдВ


рдкреБрдирд░рд╛рд░рдВрдн рдФрд░ рдХрд╛рд░реНрдп рдЕрдиреБрднрд╡ рдЖрдкрдХреЛ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рдкрд╣рд▓реА рдЫрд╛рдк рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рд╕рд╣рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд░рд┐рдЬреНрдпреВрдо рдФрд░ "рдЕрдиреБрднрд╡" рдХреЗ рд╕рд╛рде, рдПрдХ рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕реЗ рдХрдИ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рд░рд┐рдЬреНрдпреВрдо рдореБрдЭреЗ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд▓реЛрдЧ рдЦреБрдж рд╣реА рдкреЗрд╢реЗрд╡рд░ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдЪрд╛рд░ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред

рдХрднреА-рдХрднреА, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдореНрдореАрджрд╡рд╛рд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рджрд╕ рдорд┐рдирдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рд╕рд╡рд╛рд▓реЛрдВ рд╕реЗ рд╣реИрд░рд╛рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдпрд╛рдВрдбреЗрдХреНрд╕ рдореЗрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдЖрдорддреМрд░ рдкрд░ рд╕реНрдХрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рдорд┐рдирдЯ рдореЗрдВ рдЯреНрд░реИрдлрд┐рдХ рдЬрд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдЖрдпрд╛ рдерд╛, рдХреЛ рд░рд╛рдЬрдиреАрддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреБрд░рд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ 2 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рддрдирд╛ рджреЗрдирд╛, рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд▓реЗрдВрдЧреЗ - рдиреИрддрд┐рдХрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗред рддрджрдиреБрд╕рд╛рд░, рдПрдХ рджреВрд░рд╕реНрде рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдкрд░ рд╕рдордп рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдЕрддрд┐ рдирд╣реАрдВ рд╣реИ, рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд┐рд╕реА рдЕрд▓реНрдкрдЬреНрдЮрд╛рдд рддрдереНрдп рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ред рдПрдХ рдмрд╣реБрдд рд▓рдВрдмреЗ рдФрд░ рдЬрдЯрд┐рд▓ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХреА рд▓рдЧрднрдЧ рдЖрдзреА рдХреНрд╖рдорддрд╛рдПрдВ рдХреБрдЫ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмреИрд╕рд╛рдЦреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЗ рд╣рдорд╛рд░реЗ рдкреНрд░рд┐рдп C ++ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЖрдк C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдРрд╕рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдпрд╣ рдЕрднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рднрд╛рд╖рд╛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреНрдЮрд╛рди, рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ, рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдЖрджрд┐ рдкрд░ 10-15 рдкреНрд░рд╢реНрди рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ, рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, 70-80 рдкреНрд░рддрд┐рд╢рдд рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░реАрдХреНрд╖рдг рд╣реА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рд╡рд┐рд╖рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЦреБрдж рд╣реА рдЙрддреНрддрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ (рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ), рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдиреЗ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдЪреБрдирд╛ред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЬреНрдЮрд╛рди рд╣реИред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╢рд╛рдпрдж рдмрд╣реБрдд рдХрдо рд▓реЛрдЧ рдЬреЛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдЦреБрдж рдХреЛ рджрд┐рд▓ рд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд▓рд╛рд▓-рдХрд╛рд▓реЗ рдкреЗрдбрд╝ рдХреЛ рдХреИрд╕реЗ рдШреБрдорд╛рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдЙрдирдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╣реА рд▓реЛрдЧреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдЯ рдкрдврд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 30 рдкреГрд╖реНрдареЛрдВ рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдХрд░рдХреЗ рдЗрд╕ рдЪрд░рдг рдХреА рддреИрдпрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕реВрдЪреА рд╕реЗ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЙрдирдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдФрд░ рднреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдПрдВред

рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛


рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд╛рдд, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдЪреНрдЫрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдФрд░ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ, рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдбрд╛рд▓рдирд╛ рд╣реИред рдпрд╣рд╛рдБ рдЖрдк рдЯреЙрдо рдбреЗ рдорд╛рд░реНрдХреЛ рдФрд░ рдЯрд┐рдореЛрдереА рд▓рд┐рд╕реНрдЯрд░ рдХреА рдХрд┐рддрд╛рдм "рдж рд╣реНрдпреВрдорди рдлреИрдХреНрдЯрд░" рдХреЗ рдПрдХ рдЕрдВрд╢ рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдореИрдиреЗрдЬрд░: "рддреБрдо рдХрдм рд╕реЗ рдмрд╛рдЬреА рдорд╛рд░ рд░рд╣реЗ рд╣реЛ?"
рдЙрдореНрдореАрджрд╡рд╛рд░: "рдареАрдХ рд╣реИ, рд▓рдЧрднрдЧ рдЫрд╣ рд╕рд╛рд▓ред"
рдореИрдиреЗрдЬрд░: "рдХреНрдпрд╛ рдЖрдк рддреАрди, рдЪрд╛рд░, рдкрд╛рдВрдЪ рдЧреЗрдВрджреЗрдВ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ?"
рдЙрдореНрдореАрджрд╡рд╛рд░: "рд╣рд╛рдБ, рд╣рд╛рдБ рдФрд░ рд╣рд╛рдБред"
рдкреНрд░рдмрдВрдзрдХ: "рдХреНрдпрд╛ рдЖрдк рдЬрд▓рддреА рд╣реБрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?"
рдЙрдореНрдореАрджрд╡рд╛рд░: "рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред"
рдкреНрд░рдмрдВрдзрдХ: "... рдЪрд╛рдХреВ, рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рд┐рдЧрд╛рд░ рдХреЗ рд╕рд╛рде рдЦреБрд▓реЗ рдмрдХреНрд╕реЗ, рдирд░рдо рдЪреМрдбрд╝реА рдЯреЛрдкреА?"
рдЙрдореНрдореАрджрд╡рд╛рд░: "рдореБрдЭреЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред"
рдореИрдиреЗрдЬрд░: "рдХреНрдпрд╛ рддреБрдо рдХрд┐рд╕реА рдордЬрд╝реЗрджрд╛рд░ рдЬрд╝реБрдмрд╛рди рдХреЛ рдЬрд╛рдирддреЗ рд╣реЛ?"
рдЙрдореНрдореАрджрд╡рд╛рд░: "рд╡рд╣ рдмреЗрдЬреЛрдбрд╝ рд╣реИред"
рдореИрдиреЗрдЬрд░: тАЬрдЕрдЪреНрдЫрд╛, рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрдкрдХреЛ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗред тАЭ
рдХреИрдВрдбрд┐рдбреЗрдЯ: "рдЖрд╣ ... рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдмрд╛рдЬреАрдЧрд░реА рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ?"
рдореИрдиреЗрдЬрд░: "рд╣рдореНрдо, рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реБрдЖред"

рдЗрд╕рд▓рд┐рдП, рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ, рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рд╣рдо рдЖрдкрдХреЛ рдПрдХ рдРрд╕реЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреЗрдВрдЧреЗ рдЬреЛ рдЖрдк рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдкрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдард┐рдирд╛рдИ рдХреЗ рдордзреНрдпрдо рд╕реНрддрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдП рдереЗред

рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрдЦреНрдпрд╛рдУрдВ, рд╕рдВрдЪрд╛рд▓рди + - * / рдФрд░ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрддреНрд░ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рд╕реВрддреНрд░ рдорд╣рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рд░реНрдп, рдкреИрд░рд╛рдореАрдЯрд░ рдЖрджрд┐ рдХреЛ рджрд░реНрдЬ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рдЖрдордиреЗ-рд╕рд╛рдордиреЗ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред 2 рдШрдВрдЯреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рддрд╛ рдХрд┐ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдкрдХреНрд╖ рд╣реИред рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдордп, рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдереЛрдбрд╝рд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдФрд░ рд╕реБрдЭрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕реНрддрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рджреЛ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рджрд┐рдпрд╛: рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдФрд░ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдЬреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реБрдЖ рдХрд░рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рджреЛрдиреЛрдВ рдиреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рддрд╛рдЬрд╝рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рдкрд╣рд▓реЗ рдиреЗ рджреЛ рдШрдВрдЯреЗ рдореЗрдВ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛, рдЬрдмрдХрд┐ рджреВрд╕рд░реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЪрд╛рд░ рдШрдВрдЯреЗ рд▓рдЧреЗред рдХрд╛рд░реНрдп рдорд╛рдирдХ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛, рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЖрдорддреМрд░ рдкрд░ рдЖрдзреЗ рдШрдВрдЯреЗ рд╕реЗ рджреЛ рддрдХ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрдерд╛рд╕рдВрднрд╡ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рдпрд╣ рд╕рдм рдЬрд╛рдирддрд╛ рд╣реИред

рддреЛ, рд╣рдо рд╕реВрддреНрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╣рдо рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдиреЛрдбреНрд╕ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ рдХреЛрд╖реНрдардХ рдирд╣реАрдВ рдереЗ, рддреЛ рдкреЗрдбрд╝ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдСрдкрд░реЗрд╢рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рд╣реИрдВ, рдХреНрд░рдорд╢рдГ, рдкреЗрдбрд╝ рджреЛ-рд╕реНрддрд░реАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: + рдФрд░ - рд╢реАрд░реНрд╖ рдкрд░ рдЦрдбрд╝рд╛ рд╣реИ, * рдФрд░ / рд╕рдмрд╕реЗ рдиреАрдЪреЗ рд╣реИред

рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдХреЛрд╖реНрдардХ рдореМрдЬреВрдж рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреЗрдбрд╝ рдореЗрдВ рдЕрд╕реАрдорд┐рдд рдШреЛрдВрд╕рд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдХрд╛ рднреЛрд▓реА рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╣рдо рдХреЛрд╖реНрдардХ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд░ a1, a2, a3, a4 рдХреЗ рдирд╛рдо ... рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рджреЛ-рд╕реНрддрд░реАрдп рд╡реГрдХреНрд╖ рдорд┐рд▓рддреЗ рд╣реИрдВред рдлрд┐рд░, рдкреЗрдбрд╝ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рдЬрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд░рд╣рддрд╛ рд╣реИ, рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд╖реНрдардХ рдореЗрдВ рдХреНрдпрд╛ рдерд╛ рдФрд░ рд╕рдмрдЯреНрд░реА рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓реЗрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рджреНрд╡рд┐рдШрд╛рдд рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдорд┐рд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 100 рдорд┐рд▓рд┐рдпрди рдиреЗрд╕реНрдЯреЗрдб рдмреНрд░реИрдХреЗрдЯ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреА, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рд╡рд░реНрдгреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рдирд┐рд░реНрдгрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдРрд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрд╣реБрдд рд╕рд┐рд░-рдкрд░ рдФрд░ рдЕрдХреНрд╖рдо рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдЯ рдХрд░реЗрдВрдЧреЗ, рддреБрд░рдВрдд рдПрдХ рд░реИрдЦрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдПрдХ рд╕рдорд╛рдкрди рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рджреЛрдиреЛрдВ рдкрд░реАрдХреНрд╖рд╛рд░реНрдереА рдЗрд╕ рддрд░рд╣ рдЧрдПред рдирддреАрдЬрддрди, рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢реАрдп рдкрд╛рд░реНрд╕рд░ ( рдПрд▓рдПрд▓ рдкрд╛рд░реНрд╕рд░ рдХреА рдЙрдк-рдкреНрд░рдЬрд╛рддрд┐) рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдорд┐рд▓рд╛ред

рдкреНрд░рдмрдВрдзрдХ рдХреЛрдб
#include <string>
#include <cassert>
#include <memory>
#include <stdexcept>
#include <vector>
#include <iostream>
#include <cstdio>

using namespace std;

struct Token {
        enum Type { value, operation, opening_bracket, closing_bracket};
        Type type;
        string text;
};

struct Tokenizer {
        //I am too lazy to write real tokenizer, it is very simple. I hope formula generator for fake tokenizer will be ok. 
public:
        Tokenizer() { content=generate(); pos=content.begin(); } ;
        const Token* peek() { return pos!=content.end() ?&*pos:0; } ;
        const Token* get() { if (pos!=content.end()) { cout << pos->text << " "; } return pos!=content.end()?&*pos++:0; } ;
private:
    vector<Token> generate(int level=0);
    
private:
        vector<Token>::iterator pos;
        vector<Token> content;
};

//To be honest using classes for expression parsing is a bit overkill, old style could save some code. 
class Expression;
typedef struct auto_ptr<Expression> ExpressionPtr;

//Represents abstract expression
class Expression {
public:
        Expression() {}
        virtual ~Expression() {}
        //actually this static parse functions should be constructor in most classes. I.e. this is violation of principle 'Resource Acquisition Is Initialization'.
        //but some functions return different classes depending on context, i.e. this is some kind of 'virtual constructor' (see Operation::parse for example)
        //so I made decision to make static construction function in all classes, just for uniformity
        static ExpressionPtr parse(Tokenizer& tokens);
        virtual float calc()=0;
        virtual void debug(string prefix)=0;
};


//Represents single value: for example 3.1415
class Value: public Expression {
public:
        Value() {}
        virtual ~Value() {}
        static bool isItYou(Tokenizer& tokens);
        static ExpressionPtr parse(Tokenizer& tokens);
        virtual float calc() { return _value; }
        virtual void debug(string prefix) { cout << prefix << "Value(" <<  calc() <<"): " << _value << endl; } 
protected:
        float _value;
};

//Represents operation: + or -
class Operation: public Expression {
public:
        Operation() {};
        virtual ~Operation() {}
        static ExpressionPtr parse(Tokenizer& tokens, ExpressionPtr& l);
        virtual float calc();
        virtual void debug(string prefix) { cout << prefix << "Operation(" <<  calc() <<"): " << _operation << endl; if ( _left.get() ) _left->debug(prefix + "\t"); if ( _right.get() ) _right->debug(prefix + "\t"); } 
protected:
        std::auto_ptr<Expression> _left;
        std::auto_ptr<Expression> _right;
        string _operation;
};

//Represents operation: * or /
class PriorityOperation: public Operation {
public:
        PriorityOperation() {};
        virtual ~PriorityOperation() {}
        static ExpressionPtr parse(Tokenizer& tokens, ExpressionPtr& left);
        //virtual float calc(); inherit it
        virtual void debug(string prefix) { cout << prefix << "PriorityOperation(" <<  calc() <<"): " << _operation << endl; if ( _left.get() ) _left->debug(prefix + "\t"); if ( _right.get() ) _right->debug(prefix + "\t"); } 
};


//Represents bracketed expression: (expr)
class BracketExpression: public Expression {
public:
        static bool isItYou(Tokenizer& tokens);
        static ExpressionPtr parse(Tokenizer& tokens);
        virtual float calc() { return _internal->calc(); } ;
        virtual void debug(string prefix) { cout << prefix << "Brackets(" <<  calc() <<"): "  << endl; _internal->debug(prefix + "\t"); } 
protected:
        std::auto_ptr<Expression> _internal; 
};


ExpressionPtr Expression::parse(Tokenizer& tokens)
{
    //cout << "Expression::parse" << endl;
    
        if (!tokens.peek()) return ExpressionPtr();

        if ( BracketExpression::isItYou(tokens) )
        {
                return BracketExpression::parse(tokens);
        }
        else
        if ( Value::isItYou(tokens) )
        {        
                return Value::parse(tokens);
        }
        else
        {
                throw logic_error("(Expression) Wtf is that: " + tokens.peek()->text );
        }
}

bool Value::isItYou(Tokenizer& tokens) 
{
        const Token* t = tokens.peek();
        if ( !t || t->type != Token::value ) return false; 

        char* endptr;
        strtod( t->text.c_str(), &endptr);
        return *endptr == 0;
}

ExpressionPtr Value::parse(Tokenizer& tokens)
{
    //cout << "Value::parse" << endl;
    
        std::auto_ptr<Value> foo( new Value );

        const Token* t=tokens.get();
        assert( t && t->type == Token::value ); 

        char* endptr;
        foo->_value = strtod( t->text.c_str(), &endptr);
        return ExpressionPtr(foo.release()); //lack of heterosexual auto_ptr conversions is killing me
}

bool BracketExpression::isItYou(Tokenizer& tokens) 
{
        return tokens.peek() && tokens.peek()->type == Token::opening_bracket;
}


ExpressionPtr BracketExpression::parse(Tokenizer& tokens)
{
    //cout << "BracketExpression::parse" << endl;
        const Token* t=tokens.get();
        assert ( t->type == Token::opening_bracket );

        auto_ptr<BracketExpression> result ( new BracketExpression );
        ExpressionPtr null;
        result->_internal = Operation::parse(tokens, null);

        t = tokens.get();
        if ( t ==0 || t->type != Token::closing_bracket )
        {
                throw logic_error("(BracketExpression) mismatched brackets ");
        }

        return ExpressionPtr(result.release());
}


ExpressionPtr Operation::parse(Tokenizer& tokens, ExpressionPtr& l)
{
    //cout << "Operation::parse:" << l.get() << endl;
        ExpressionPtr left;

        if (l.get()) 
        {
                left=l;
                // left is assigned for us.
        }
        else
        {
                left=Expression::parse(tokens);
        }        

        const Token *t=tokens.peek();
        if (!t || t->type == Token::closing_bracket  ) return left; //just return Value, sorry no operation guys

        if (t->type == Token::operation && (t->text=="*" || t->text=="/") )
        {
                ExpressionPtr result = PriorityOperation::parse(tokens, left);                 
                //we got exit after priority operations will end, parse position will be on + or - or at end
                left = result;        

                t=tokens.peek();
                if (!t || t->type == Token::closing_bracket  ) return left; //just return Value, sorry no operation guys
        }

    //cout << "Operation::parse again" << endl;
        if (t->type == Token::operation && (t->text=="+" || t->text=="-") )
        {
                tokens.get(); //just commit previous peek

                auto_ptr<Operation> result ( new Operation );
                result->_operation = t->text;
                result->_left=left; //smart ptr giveup ownership
        
        //cout << "Operation::parse before token" << endl;
        ExpressionPtr foo=Expression::parse(tokens);
        //cout << "Operation::parse after expression" << endl;
        
        const Token *t=tokens.peek();
        
        if (t != 0 && (t->text=="*" || t->text=="/"))
        {
            //cout << "Operation::parse to priority" << endl;
            foo = PriorityOperation::parse(tokens,foo);
        }
        
        result->_right=foo;
        
        ExpressionPtr bar(result.release());
        return Operation::parse(tokens, bar);
                
        }
        else
        {
                throw logic_error("(Operation) Wtf is that: " + tokens.peek()->text);
        }
}

ExpressionPtr PriorityOperation::parse(Tokenizer& tokens, ExpressionPtr& left)
{
    //cout << "PriorityOperation::parse" << endl;
    
    // left is already assigned for priority operation
        const Token *t=tokens.peek();
        if (!t || t->type == Token::closing_bracket  ) return left; //just return Value, sorry no operation guys

        if (t->type == Token::operation && (t->text=="*" || t->text=="/") )
        {
                tokens.get(); //commit previuos peek

                auto_ptr<PriorityOperation> result ( new PriorityOperation ); 
                result->_operation = t->text;
                result->_left=left;
                result->_right=Expression::parse(tokens);
                ExpressionPtr rs(result.release());

                return PriorityOperation::parse(tokens, rs);

        }
        else if (t->type == Token::operation && (t->text=="+" || t->text=="-") )
        {
                return left;
        }
        else
        {
                throw logic_error("(PriorityOperation) Wtf is that: " + tokens.peek()->text );
        }
}


float Operation::calc()
{
        if (_operation == "+")
        {
                float l=_left.get()?_left->calc():0.0f;
                float r=_right.get()?_right->calc():0.0f;
                return l+r;
        }
        else
        if (_operation == "-")
        {
                float l=_left.get()?_left->calc():0.0f;
                float r=_right.get()?_right->calc():0.0f;
                return l-r;
        }        
        else
        if (_operation == "*")
        {
                float l=_left.get()?_left->calc():1.0f;
                float r=_right.get()?_right->calc():1.0f;
                return  l*r; 
        }        
        else
        if (_operation == "/")
        {
                float l = _left.get()?_left->calc():1.0f;
                float r = _right.get()?_right->calc():1.0f;
                return l/r;
        }
        else
        {
                throw logic_error("Wft: operation udefined");
        }                
}

//returning vector by value, will be slow( O(n*n) actually ), but it is just testing code.
vector<Token> Tokenizer::generate(int level)
{
    //be careful with this value - formula size is approx 2^level
    if (level > 6)
    {
        Token t;
        char f[100];
        snprintf(f,100,"%d",int(rand() % 100));
        t.text=f;
        t.type=Token::value;
        return vector<Token>(&t,&t+1);
    }

    if (rand() % 10 == 0)
    {
            vector<Token> result;
            Token t1,t2;
            t1.type=Token::opening_bracket;
            t1.text="(";
            t2.type=Token::closing_bracket;
            t2.text=")";
            result.push_back(t1);
            vector<Token> r=generate(level+1);
            result.insert(result.end(),r.begin(),r.end());
            result.push_back(t2);

            return result;
    }        

    char op = "+-*/"[rand()%4];
    Token t;
    t.type=Token::operation;
    t.text=op;

    vector<Token> result=generate(level+1);
    result.push_back(t);
    vector<Token> r2=generate(level+1);
    result.insert(result.end(),r2.begin(),r2.end());

    return result;
}

int main()
{        
        try
        {
                //create fake tokenizer
                Tokenizer tk;

                //parse it
                ExpressionPtr null;
                ExpressionPtr foo = Operation::parse(tk,null);
                cout << endl;
                foo->debug("");
                float result = foo->calc();        
                cout << "result = " << result << endl;
        }
        catch(exception& e)
        {
                cout << e.what() << endl;
                return 1;                  
        }

        return 0;
}


#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>

struct token {
    enum { E_UNDEF, E_NUMBER, E_OPERATOR, E_LEVEL  } type;

    union {
        double d_val;
        int i_val;
        char c_val;
    } data;

    token() {
        type = E_UNDEF;
    }

    token(double val) : type(E_NUMBER) {
        data.d_val = val;
    }
    token(int val) : type(E_LEVEL) {
        data.i_val = val;
    }
    token(char val) : type(E_OPERATOR) {
        data.c_val = val;
    }
};

typedef std::vector<token> tokens;

void push_level(tokens &pr, int level) {
    if (pr.empty() || pr.back().type != token::E_LEVEL) {
        pr.push_back(token(level));
    } else {
        pr.back().data.i_val += level;
    }
}

void push_operator(tokens &pr, char op) {
    pr.push_back(token(op));
}

void push_number(tokens &pr, int num) {
    if (pr.empty() || pr.back().type == token::E_LEVEL || (pr.back().type == token::E_OPERATOR && pr.size() > 1 && pr[pr.size() - 2].type == token::E_NUMBER) ) {
        pr.push_back(token((double)num));
    } else if (pr.back().type == token::E_OPERATOR && (pr.size() == 1 || pr[pr.size() - 2].type == token::E_LEVEL) ) {
        if (pr.back().data.c_val == '*' || pr.back().data.c_val == '/') {
            throw std::domain_error("unexpected operator");
        }
        if (pr.back().data.c_val == '-') {
            num = -num;
        }
        pr.pop_back();
        pr.push_back(token((double)num));
    } else {
        throw std::domain_error("unexpected number");
    }
}

token calc3(tokens &pr) {
    token s2 = pr.back(); pr.pop_back();
    token op = pr.back(); pr.pop_back();
    token s1 = pr.back(); pr.pop_back();

    if (s1.type != token::E_NUMBER || op.type != token::E_OPERATOR || s2.type != token::E_NUMBER) {
        throw std::domain_error("unexpected closing brace");
    }

    switch (op.data.c_val) {
        case '+':
            s1.data.d_val += s2.data.d_val;
            break;
        case '-':
            s1.data.d_val -= s2.data.d_val;
            break;
        case '*':
            s1.data.d_val *= s2.data.d_val;
            break;
        case '/':
            s1.data.d_val /= s2.data.d_val;
            break;
        default:
        throw std::domain_error("internal error");
    }

    return s1;
}

void pop_level(tokens &pr, int level) {
    if (level == 0) {
        if (pr.size() > 3) {
            pr.push_back(calc3(pr));
        }
        return;
    }
    if (pr.empty() || pr.back().type == token::E_LEVEL || pr.back().type == token::E_OPERATOR) {
        throw std::domain_error("unexpected closing brace");
    } else if (pr.size() > 1 && pr[pr.size() - 2].type == token::E_LEVEL) {
        if (pr[pr.size() - 2].data.i_val > level) {
            pr[pr.size() - 2].data.i_val -= level;
        } else {
            int delta = level - pr[pr.size() - 2].data.i_val;
            token tmp = pr.back();
            pr.pop_back(); pr.pop_back();
            pr.push_back(tmp);
            pop_level(pr, delta);
        }
    } else if (pr.size() > 3) {
        token s1 = calc3(pr);

        if (pr.back().type == token::E_LEVEL) {
            if (pr.back().data.i_val > level) {
                pr.back().data.i_val -= level;
                pr.push_back(s1);
            } else {
                int delta = level - pr.back().data.i_val;
                pr.pop_back();
                pr.push_back(s1);
                pop_level(pr, delta);
            }
        } else if (pr.back().type == token::E_OPERATOR) {
            pr.push_back(s1);
            pop_level(pr, level);
        } else {
            throw std::domain_error("unexpected closing brace");
        }
    } else {
        throw std::domain_error("unexpected closing brace");
    }
}

double process(const std::string &str) {
    tokens program;

    push_level(program, 3);
    for (std::string::const_iterator cit = str.begin(); cit != str.end(); ++cit) {
        switch (*cit) {
            case '(':
                push_level(program, 3);
                break;
            case ')':
                pop_level(program, 3);
                break;
            case '*':
            case '/':
                pop_level(program, 1);
                push_operator(program, *cit);
                push_level(program, 1);
                break;
            case '+':
            case '-':
                if (cit == str.begin() || strchr("(+/-*", *(cit-1))) {
                    push_operator(program, *cit);
                } else {
                    pop_level(program, 2);
                    push_operator(program, *cit);
                    push_level(program, 2);
                }
                break;
            case ' ':
                break;
            case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
                {
                    int curnum = 0;
                    while (cit != str.end()) {
                        curnum = 10*curnum + (*cit - '0');
                        if ((cit + 1) == str.end() || !isdigit(*(cit+1))) {
                            break;
                        }
                        ++cit;
                    }
                    push_number(program, curnum);
                }
                break;
            default:
                throw std::domain_error("unexpected symbol");
        }
    }
    pop_level(program, 3);

    if (program.size() == 0 || program.size() > 1) {
        throw std::domain_error("incomplete expression");
    }

    return program.back().data.d_val;
}

int main() {
    std::string line;
    while (!std::cin.eof()) {
        std::getline(std::cin, line);

        if (line.length() > 0) {
            try {
                std::cout << process(line) << std::endl;
            } catch (std::exception &e) {
                std::cout << "error: " << e.what() << std::endl;
            }
        }
    }

    return 0;
}

- , . - .

, shunting yard algorithm. Recursive descent parser LR-.


senior-, , .

. , , , , , , , .

тАУ , . , . , , , .

, . . , , . , тАУ .

, , . , , . , .

, - , . , . . , , , тАУ , .

++
  • , ┬л + = ┬╗
  • , , ┬л: ┬╗
  • ┬л ++┬╗
  • Scott Meyers. Effective C++. More Effective C++. Effective STL
  • Herb Sutter ┬лExceptional C++┬╗ ┬лMore Exceptional C++┬╗


(, .)

Source: https://habr.com/ru/post/In206234/


All Articles