Guest User

Untitled

a guest
May 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <glib.h>
  4. #include <libxml++/libxml++.h>
  5. #include <iomanip>
  6.  
  7. int k = 0;
  8. struct city
  9. {
  10. Glib::ustring district, address,amount ;
  11. };
  12.  
  13. class CParser : public xmlpp::SaxParser
  14. {
  15. private:
  16. city v_district, v_address, current_info, create, last;
  17. std::stack<Glib::ustring> tags;
  18.  
  19. public:
  20. CParser(Glib::ustring& first_currency, Glib::ustring& second_currency)
  21. {
  22. v_district.district = first_currency;
  23. v_district.amount = "-1";
  24. v_address.address = second_currency;
  25. v_address.amount = "-1";
  26. create.amount = first_currency;
  27. create.address = second_currency;
  28. }
  29.  
  30. virtual ~CParser() {}
  31.  
  32. void print_result_District()
  33. {
  34. std::cout << "District " << v_district.district << " " << "Amount of surveillance cameras = " << k << std::endl;
  35. }
  36.  
  37. void print_result_Address()
  38. {
  39. int amount_address = std::stod(v_address.amount.substr(0, v_address.amount.length()));
  40. std::cout << "Address " << v_address.address << " " << "Amount of surveillance cameras = " << amount_address << std::endl;
  41. }
  42.  
  43.  
  44.  
  45. protected:
  46. virtual void on_start_document() override
  47. {
  48.  
  49. }
  50.  
  51. virtual void on_end_document() override
  52. {
  53.  
  54. }
  55.  
  56. virtual void on_start_element(const Glib::ustring& name,
  57. const AttributeList& properties) override
  58. {
  59. tags.push(name);
  60.  
  61. if (name == "addresses_camera_installation")
  62. {
  63. current_info.district.clear();
  64. current_info.address.clear();
  65. current_info.amount.clear();
  66. }
  67. }
  68.  
  69. virtual void on_end_element(const Glib::ustring& name) override
  70. { last = current_info;
  71. tags.pop();
  72. if ((name == "dataset" )&& ( create.amount == create.address) )
  73. {
  74. k+= std::stod(last.amount.substr(0,current_info.amount.length()));
  75. std::cout <<"District " << last.district << " " <<"Amount of surveillance cameras = "<< k << std::endl;
  76. }
  77. if (name == "addresses_camera_installation")
  78. { if ( create.amount == create.address )
  79. { if (v_district.district =="-1")
  80. {
  81. v_district = current_info;
  82. }
  83. else if (current_info.district == v_district.district)
  84. {
  85.  
  86. k += std::stod(v_district.amount.substr(0,current_info.amount.length()));
  87. v_district = current_info;
  88. }
  89.  
  90. else
  91. {
  92. k += std::stod(v_district.amount.substr(0,current_info.amount.length()));
  93. create.district = v_district.district;
  94. v_district = current_info;
  95.  
  96. std::cout << "District " << create.district << " " <<"Amount of surveillance cameras = " << k << std::endl;
  97. k = 0;
  98. }
  99. }
  100. else if (current_info.district == v_district.district)
  101. {
  102. v_district = current_info;
  103. k += std::stod(current_info.amount.substr(0,current_info.amount.length()));
  104. }
  105. else if (current_info.address == v_address.address)
  106. {
  107. v_address = current_info;
  108. }
  109.  
  110. }
  111. }
  112.  
  113. virtual void on_characters(const Glib::ustring& chars) override
  114. {
  115. if (tags.top() == "district")
  116. {
  117. current_info.district = chars;
  118. }
  119. else if (tags.top() == "address")
  120. {
  121. current_info.address = chars;
  122. }
  123. else if (tags.top() == "amount")
  124. {
  125. current_info.amount = chars;
  126. }
  127.  
  128.  
  129. }
  130.  
  131. virtual void on_comment(const Glib::ustring& text) override
  132. {
  133.  
  134. }
  135.  
  136. virtual void on_warning(const Glib::ustring& text) override
  137. {
  138.  
  139. }
  140.  
  141. virtual void on_error(const Glib::ustring& text) override
  142. {
  143.  
  144. }
  145.  
  146. virtual void on_fatal_error(const Glib::ustring& text) override
  147. {
  148.  
  149. }
  150. };
  151.  
  152. int main(int argc, char** argv)
  153. {
  154. Glib::ustring filename("city.xml");
  155. Glib::ustring district("-1"), address("-1");
  156.  
  157. std::locale::global(std::locale(""));
  158.  
  159. for (int i = 1; i < argc - 1; ++i)
  160. {
  161. Glib::ustring arg = argv[i];
  162. if (arg == "--file")
  163. filename = argv[++i];
  164. else if (arg == "--district")
  165. district = argv[++i];
  166. else if (arg == "--address")
  167. address = argv[++i];
  168. }
  169.  
  170. if (address == district)
  171. {
  172. CParser parser(district, address);
  173. parser.parse_file(filename);
  174. }
  175. else if (address == "-1")
  176. {
  177. CParser parser(district, address);
  178. parser.parse_file(filename);
  179. parser.print_result_District();
  180. }
  181. else if(district == "-1")
  182. {
  183. CParser parser(district, address);
  184. parser.parse_file(filename);
  185. parser.print_result_Address();
  186. }
  187. return 0;
  188. }
  189. /*
  190. <?xml version='1.0' encoding='utf-8'?>
  191. <dataset>
  192. <addresses_camera_installation>
  193. <number>1.1</number>
  194. <district>QWE</district>
  195. <address>WP</address>
  196. <amount>3</amount>
  197. </addresses_camera_installation>
  198. <addresses_camera_installation>
  199. <number>1.2</number>
  200. <district>QWE</district>
  201. <address>11-я Красноармейская ул., д.9</address>
  202. <amount>3</amount>
  203. </addresses_camera_installation>
  204. <addresses_camera_installation>
  205. <number>1.3</number>
  206. <district>BB</district>
  207. <address>12-я Красноармейская ул., д.1/21</address>
  208. <amount>1</amount>
  209. </addresses_camera_installation>
  210. <addresses_camera_installation>
  211. <number>1.4</number>
  212. <district>BB</district>
  213. <address>13-я Красноармейская ул., д.24</address>
  214. <amount>3</amount>
  215. </addresses_camera_installation>
  216. <addresses_camera_installation>
  217. <number>1.5</number>
  218. <district>CC</district>
  219. <address>1-я Красноармейская ул., д.7-9</address>
  220. <amount>3</amount>
  221. </addresses_camera_installation>
  222. <addresses_camera_installation>
  223. <number>1.5</number>
  224. <district>CC</district>
  225. <address>1-я Красноармейская ул., д.7-9</address>
  226. <amount>3</amount>
  227. </addresses_camera_installation>
  228. </dataset>
  229. */
Add Comment
Please, Sign In to add comment