Advertisement
Guest User

Untitled

a guest
May 27th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.84 KB | None | 0 0
  1. #include "sword.h"
  2. #include "bow.h"
  3. #include "catapult.h"
  4. #include "pike.h"
  5. #include <windows.h>
  6. #include <list>
  7. #include <fstream>
  8.  
  9. using namespace std;
  10. using namespace sword;
  11. using namespace bow;
  12. using namespace catapult;
  13. using namespace pike;
  14.  
  15. // Вывод списка на экран
  16. void PrintList(list <Weapon*> &Weap)
  17. {
  18. list <Weapon*> :: iterator pos;
  19. pos = Weap.begin();
  20. Weapon* w;
  21. while (pos!=Weap.end())
  22. {
  23. w = *pos;
  24. cout << *w;
  25. pos++;
  26. }
  27. }
  28. // Запись списка в файл
  29. void FileWriteList(list <Weapon*> &Weap, string filename)
  30. {
  31. const char *c = filename.c_str();
  32. list <Weapon*> :: iterator pos;
  33. pos = Weap.begin();
  34. ofstream file_out(c);
  35. Weapon* w;
  36. while (pos!=Weap.end())
  37. {
  38. w = *pos;
  39. file_out << *w;
  40. pos++;
  41. }
  42. file_out.close();
  43. }
  44. // Чтение списка из файла
  45. void FileReadList(list <Weapon*> &Weap, string filename)
  46. {
  47. const char *c = filename.c_str();
  48. ifstream file_in(c);
  49. if (file_in==NULL)
  50. {
  51. cout << "Ошибка чтения файла. Проверьте правильность имени файла и убедитесь, что он существует" << endl;
  52. }
  53. else
  54. {
  55. string klass;
  56. Weapon *w;
  57. do
  58. {
  59. getline(file_in,klass);
  60. if (klass!="")
  61. {
  62. if (klass=="оружие - ближний бой - меч") w = new Sword;
  63. if (klass=="оружие - ближний бой - копье") w = new Pike;
  64. if (klass=="оружие - дальний бой - лук") w = new Bow;
  65. if (klass=="оружие - дальний бой - рогатка") w = new Catapult;
  66.  
  67. file_in >> *w;
  68. Weap.push_back(w);
  69. for (int i=0;i<4;i++)
  70. getline(file_in,klass);
  71. }
  72. } while (!file_in.eof());
  73. file_in.close();
  74. }
  75. }
  76. // Определить указатель на элемент по номеру
  77. list <Weapon*> :: iterator Pos(list <Weapon*> &Weap, unsigned int n)
  78. {
  79. list <Weapon*> :: iterator pos;
  80. pos = Weap.begin();
  81. while (n>0) {pos++; n--;}
  82. return pos;
  83. }
  84. // Добавление по номеру позиции
  85. void InsertToList(list <Weapon*> &Weap, unsigned int n, Weapon *w)
  86. {
  87. if ((Weap.size()>n)&&(n>=0))
  88. {
  89. list <Weapon*> :: iterator pos;
  90. pos = Pos(Weap,n);
  91. Weap.insert(pos, w);
  92. }
  93. }
  94. // Удаление по номеру позиции
  95. void EraseFromList(list <Weapon*> &Weap, unsigned int n)
  96. {
  97. if ((Weap.size()>n)&&(n>=0))
  98. {
  99. list <Weapon*> :: iterator pos;
  100. pos = Pos(Weap,n);
  101. Weap.erase(pos);
  102. }
  103. }
  104. // Меню
  105. void Menu()
  106. {
  107. cout << "Курсовая работа по дисциплине \"Основы программирования\" \n"
  108. << "студента группы ИСТбд-11 Корнева А.Ю.\n"
  109. << "Связный список \"Оружие\" \n"
  110. << endl
  111. << "Меню:\n"
  112. << "1. Вывод списка на экран\n"
  113. << "2. Добавление элемента в список\n"
  114. << "3. Удаление элемента из списка\n"
  115. << "4. Поиск элемента в списке\n"
  116. << "5. Запись списка в файл\n"
  117. << "6. Чтение списка из файла\n"
  118. << "7. Очистка списка\n"
  119. << "8. Завершение работы\n"
  120. << endl
  121. << "Введите нужное число: ";
  122. }
  123. // Поиск элемента в списке по имени
  124. void SearchByName(list <Weapon*> &Weap, string name)
  125. {
  126. list <Weapon*> :: iterator pos;
  127. pos = Weap.begin();
  128. while (pos!=Weap.end())
  129. {
  130. Weapon *w;
  131. w = *pos;
  132. if (w->GetName() == "имя - " + name) cout << *w;
  133. pos++;
  134. }
  135. }
  136. // Ввод числа
  137. int ReadInt(int a)
  138. {
  139. again:
  140. cin >> a;
  141. cin.get();
  142. if (!cin)
  143. {
  144. cin.clear();
  145. cin.sync();
  146. cout << "ОШИБКА ввода данных (возможно неверный тип данных), попробуйте снова" << endl;
  147. goto again;
  148. }
  149. return a;
  150. }
  151.  
  152. int main()
  153. {
  154. system("chcp 1251 > NUL");
  155. string action;
  156. list <Weapon*> Weap;
  157. int flag;
  158. while (flag!=-1)
  159. {
  160. flag=0;
  161. Menu();
  162. getline(cin,action,'\n');
  163. if (action=="1")
  164. {
  165. cout << "**********СПИСОК**********" << endl;
  166. PrintList(Weap);
  167. flag=1;
  168. }
  169. if (action=="2")
  170. {
  171. cout << "Введите название класса числом от 1 до 4 (меч(1)/копье(2)/лук(3)/рогатка(4))" << endl;
  172. string classes;
  173. getline(cin,classes,'\n');
  174. Weapon *w;
  175. int flag2=0;
  176. if ((classes=="меч")||(classes=="1")) {w = new Sword; flag2=1;}
  177. if ((classes=="копье")||(classes=="2")) {w = new Pike; flag2=1;}
  178. if ((classes=="лук")||(classes=="3")) {w = new Bow; flag2=1;}
  179. if ((classes=="рогатка")||(classes=="4")) {w = new Catapult; flag2=1;}
  180. if (flag2==0) {cout << "Такого класса нет" << endl; goto esc;}
  181. cout << "Теперь введите его имя любыми символами " << endl;
  182. string name;
  183. getline(cin,name,'\n');
  184. w->SetName(name);
  185. cout << "Теперь введите номер позиции в списке, куда надо добавить элемент (начиная с номера 0)" << endl;
  186. unsigned int num;
  187. num = ReadInt(num);
  188. if (Weap.size()>num) {InsertToList(Weap,num,w);}
  189. else {cout << "Размер списка не больше номера, элемент добавлен в конец списка" << endl; Weap.push_back(w);}
  190. cout << "Добавление завершено" << endl;
  191. flag=1;
  192. }
  193. if (action=="3")
  194. {
  195. cout << "Введите номер элемента в списке, который надо удалить (начиная с номера 0)" << endl;
  196. unsigned int num;
  197. num = ReadInt(num);
  198. if (Weap.size()>num) {EraseFromList(Weap,num); cout << "Удаление завершено" << endl;}
  199. else cout << "Размер списка не больше номера, удаление невозможно" << endl;
  200. flag=1;
  201. }
  202. if (action=="4")
  203. {
  204. cout << "В данной программе реализован поиск элемента по имени"
  205. << endl
  206. << "Введите имя оружия, которое надо найти в списке"
  207. << endl;
  208. string name;
  209. getline(cin,name,'\n');
  210. cout << "**********Найденное оружие**********" << endl;
  211. SearchByName(Weap,name);
  212. flag=1;
  213. }
  214. if (action=="5")
  215. {
  216. cout << "Введите имя файла" << endl;
  217. string filename;
  218. againfileread:
  219. getline(cin,filename,'\n');
  220. if (filename=="")
  221. {
  222. cout << "ОШИБКА! Попробуйте снова" << endl;
  223. goto againfileread;
  224. }
  225. FileWriteList(Weap,filename);
  226. cout << "Запись завершена" << endl;
  227. flag=1;
  228. }
  229. if (action=="6")
  230. {
  231. cout << "Введите имя файла" << endl;
  232. string filename;
  233. againfilewrite:
  234. getline(cin,filename,'\n');
  235. if (filename=="")
  236. {
  237. cout << "ОШИБКА! Попробуйте снова" << endl;
  238. goto againfilewrite;
  239. }
  240. FileReadList(Weap,filename);
  241. cout << "Чтение завершено" << endl;
  242. flag=1;
  243. }
  244. if (action=="7")
  245. {
  246. Weap.clear();
  247. cout << "Список очищен" << endl;
  248. flag=1;
  249. }
  250. if (action=="8")
  251. {
  252. cout << "Выход из программы" << endl;
  253. flag=-1;
  254. }
  255. if (flag==0)
  256. {
  257. cout << "Попробуйте снова" << endl;
  258. }
  259. esc:
  260. system("pause");
  261. system("cls");
  262. }
  263. return 0;
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement