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

рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░реЗрдВ
рдкреБрдирд░рд╛рд░рдВрдн рдФрд░ рдХрд╛рд░реНрдп рдЕрдиреБрднрд╡ рдЖрдкрдХреЛ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рдкрд╣рд▓реА рдЫрд╛рдк рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рд╕рд╣рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд░рд┐рдЬреНрдпреВрдо рдФрд░ "рдЕрдиреБрднрд╡" рдХреЗ рд╕рд╛рде, рдПрдХ рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕реЗ рдХрдИ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рд░рд┐рдЬреНрдпреВрдо рдореБрдЭреЗ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд▓реЛрдЧ рдЦреБрдж рд╣реА рдкреЗрд╢реЗрд╡рд░ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдЪрд╛рд░ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред
рдХрднреА-рдХрднреА, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдореНрдореАрджрд╡рд╛рд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рджрд╕ рдорд┐рдирдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рднрд╛рд╖рд╛ рдХреЗ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рд╕рд╡рд╛рд▓реЛрдВ рд╕реЗ рд╣реИрд░рд╛рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдпрд╛рдВрдбреЗрдХреНрд╕ рдореЗрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдЖрдорддреМрд░ рдкрд░ рд╕реНрдХрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рдорд┐рдирдЯ рдореЗрдВ рдЯреНрд░реИрдлрд┐рдХ рдЬрд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдЖрдпрд╛ рдерд╛, рдХреЛ рд░рд╛рдЬрдиреАрддрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреБрд░рд╛ рд╣реИ, рдФрд░ рдЙрд╕реЗ 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++┬╗
(, .)