Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.79 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS // Позволяет использовать функцию strcpy
  2. #include <iostream>
  3. #include <cstring>
  4.  
  5. //
  6. //template <typename T, const int rows, const int cols>
  7. //class DynamicArray {
  8. //private:
  9. // T val[rows][cols];
  10. //public:
  11. // DynamicArray() { }
  12. //
  13. // DynamicArray(T val, int rows, int cols) : rows(rows), cols(cols) {
  14. // this->** val = new int* [rows];
  15. // for (int i = 0; i < rows; i++) {
  16. // val[i] = new int[cols] {}; //присвоили длину строки
  17. // }
  18. // //возвращаем указатель на него
  19. // }
  20. //
  21. // ~DynamicArray() {
  22. // for (int i = 0; i < rows; i++) {
  23. // delete[] val[i];
  24. // }
  25. // delete[] val;
  26. // }
  27. //
  28. // void setDynamicArray(T value, int rows, int cols) {
  29. // val[rows][cols] = value;
  30. // }
  31. //
  32. // T getDynamicArray(int rows, int cols) {
  33. // return val[rows][cols];
  34. // }
  35. //
  36. // friend std::ostream& operator<<(std::ostream& stream, const DynamicArray& val) {
  37. // for (int i = 0; i < rows; i++) {
  38. // for (int j = 0; j < cols; j++) {
  39. // stream << val[i][j] << " | ";
  40. // }
  41. // std::cout << std::endl;
  42. // }
  43. // }
  44. //};
  45.  
  46.  
  47. /*template <typename T>
  48. class Array2D {
  49. private:
  50. int rows;
  51. int cols;
  52. T** val;
  53. public:
  54. Array2D(T argVal, int argRows, int argCols) : rows(artRows), cols(argCols) {
  55. val = new T * [rows];
  56. for (int i = 0; i < rows; i++) {
  57. val[i] = new T[cols]{}; */
  58.  
  59.  
  60.  
  61. //
  62. const int MAX_STRING_SIZE = 100; // Максимальная длина для элементов карточки (как расширить до неограниченного?)
  63. class Card
  64. {
  65. struct MyStruct
  66. {
  67. MyStruct* next_;
  68. char name[MAX_STRING_SIZE]; // инициалы
  69. char pos[MAX_STRING_SIZE]; // название должности
  70. char inn[MAX_STRING_SIZE]; // инн
  71. unsigned short year; // год поступления
  72. };
  73. MyStruct* first_;
  74. int count_; // количество хранящихся в данный момент карточек (выводится при запуске функции PrintAll
  75. public:
  76. Card(); // конструктор без параметров
  77. ~Card(); // деструктор
  78. void PrintAll(std::ostream&) const; // Выводит все карточки
  79. void AddNewCard(char*,char*,char*,unsigned short); // Добавляет новую карточку (без проверки)
  80. void Sort(); // Сортировка методом простых вставок ?
  81. void Find(unsigned short) const; // Поиск по году (зачисления) на работу
  82. void DeleteAll(); // Удаляет все карточки
  83. void minElement(std::ostream& stream); // Поиск минимального элемента (по году)
  84. void maxElement(std::ostream& stream); // Поиск максимального элемента (по году)
  85.  
  86. // конструктор копирования и оператор присваивания запрещены к использованию
  87. Card(const Card&) = delete;
  88. Card& operator=(const Card&) = delete;
  89. };
  90.  
  91. Card::Card() : // конструктор
  92. first_(nullptr),
  93. count_(0)
  94. {}
  95.  
  96. Card::~Card() // деструтор
  97. {
  98. MyStruct* current = first_;
  99. while (first_)
  100. {
  101. first_ = first_->next_;
  102. delete current;
  103. current = first_;
  104. }
  105. }
  106.  
  107.  
  108.  
  109. void Card::PrintAll(std::ostream& stream) const
  110. {
  111. MyStruct* current = first_;
  112. while (current)
  113. {
  114. stream << "name: " << current->name <<"\t pos: " << current->pos << "\t inn:"
  115. << current->inn << "\t year: " << current->year << '\n';
  116. current = current->next_;
  117. }
  118. stream << "positions count: " << count_ << '\n';
  119. }
  120.  
  121. void Card::AddNewCard(char* name, char* pos, char* inn, unsigned short year)
  122. {
  123. // будем добавлять новые карточки в начало списка
  124. MyStruct* newCard = new MyStruct;
  125. // strcpy - функция из файла <cstring>;
  126. // копирует второй аргумент в первый
  127. std::strcpy(newCard->name, name);
  128. std::strcpy(newCard->pos, pos);
  129. std::strcpy(newCard->inn, inn);
  130. newCard->year = year;
  131. newCard->next_ = first_;
  132. first_ = newCard;
  133. count_++;
  134. }
  135.  
  136. void Card::DeleteAll()
  137. {
  138. MyStruct* current = first_;
  139. while (first_)
  140. {
  141. first_ = first_->next_;
  142. delete current;
  143. current = first_;
  144. }
  145. count_ = 0;
  146. }
  147.  
  148. void Card::Sort()
  149. {
  150. MyStruct* current_1 = first_;
  151.  
  152.  
  153. while(current_1)
  154. //for (MyStruct* current_1 = first_; current_1 < nullptr; current_1->next_)
  155. {
  156. MyStruct* current_2 = current_1->next_;
  157. while (current_2)
  158. //for (MyStruct* current_2 = current_1->next_; current_2 < nullptr; current_2->next_)
  159. {
  160. if (current_1->year > current_2->year)
  161. {
  162. std::swap(current_1->year, current_2->year);
  163. std::swap(current_1->pos, current_2->pos);
  164. std::swap(current_1->inn, current_2->inn);
  165. std::swap(current_1->name, current_2->name);
  166. break;
  167. }
  168. current_2 = current_2->next_;
  169. }
  170. current_1 = current_1->next_;
  171. }
  172. }
  173.  
  174. /*while (current_2)
  175. {
  176. if (current_2->year < current_1->year)
  177. {
  178. temp = current_2->year;
  179. *current_2->year = *current_1->year;
  180. *current_1->year = *temp;
  181.  
  182. }
  183. current_2 = current_2->next_;
  184. }
  185. current_1 = current_1->next_;
  186. current_2 = current_1;*/
  187.  
  188.  
  189. //char* Card::CheckElements(char* name, char* pos, char* inn, char* year)
  190. //{
  191. // int i;
  192. // std::cout << name;
  193. // MyStruct* current = first_;
  194. // if (name[0] > 'A' and name[0] < 'Z') {}
  195. // else {return name;}
  196. // for (i=1; i<sizeof(name);i++)
  197. // if (name[i] > 'a' and name[i] < 'z') {}
  198. // else {return name;}
  199. // if (name[i + 1] != ' ') { return name; }
  200. // if (name[i + 2] < 'A' and 'Z' < name[i + 2]) { return name; }
  201. // if (name[i + 3] != '.') { return name; }
  202. // if (name[i + 4] < 'A' and 'Z' < name[i + 4]) { return name; }
  203. // if (name[i + 5] != '.') { return name; }
  204. // i = 0;
  205. // if (pos[i] < 'A' and pos[i] > 'Z') { return pos; }
  206. // for(i=1; i<sizeof(pos);i++)
  207. // if (name[i] < 'a' and name[i] > 'z') { return pos; }
  208. // int count_inn = 0;
  209. // for (i = 0; i < sizeof(inn); i++)
  210. // {
  211. // if (inn[i] > '9' and inn[i] < '0') { return inn; }
  212. // count_inn += 1;
  213. // }
  214. // if (sizeof(count_inn) != 10) { return inn; }
  215. // count_inn = 0;
  216. // for (i = 0; i < sizeof(year); i++)
  217. // {
  218. // if (inn[i] > '9' and inn[i] < '0') { return inn; }
  219. // count_inn += 1;
  220. // }
  221. // if (count_inn > 2020 and sizeof(count_inn) != 4) { return year; }
  222. //
  223. //}
  224.  
  225. void Card::Find(unsigned short year) const
  226. {
  227. MyStruct* current = first_;
  228. while (current)
  229. {
  230. if (year == current->year)
  231. {
  232. std::cout << "name: \"" << current->name << "\", pos: " << current->pos << "\", inn: "
  233. << current->inn << "\" year: " << current->year << '\n';
  234. break;
  235. }
  236. current = current->next_;
  237. }
  238. }
  239.  
  240. void Card::minElement(std::ostream& stream)
  241. {
  242. MyStruct* current = first_;
  243. unsigned short minYear = first_->year;
  244. char* minINN = first_->inn;
  245. char* minName = first_->name;
  246. char* minPOS = first_->pos;
  247. while (current)
  248. {
  249. if (current->year < minYear)
  250. {
  251. minYear = current->year;
  252. minINN = current->inn;
  253. minName = current->name;
  254. minPOS = current->pos;
  255. }
  256. current = current->next_;
  257. }
  258. stream << "Name: " << minName << "\t pos: " << minPOS << "\t inn:" << minINN << "\t year: " << minYear <<'\n';
  259. }
  260.  
  261. void Card::maxElement(std::ostream& stream)
  262. {
  263. MyStruct* current = first_;
  264. unsigned short maxYear = first_->year;
  265. char* maxINN = first_->inn;
  266. char* maxName = first_->name;
  267. char* maxPOS = first_->pos;
  268. while (current)
  269. {
  270. if (current->year > maxYear)
  271. {
  272. maxYear = current->year;
  273. maxINN = current->inn;
  274. maxName = current->name;
  275. maxPOS = current->pos;
  276. }
  277. current = current->next_;
  278. }
  279. stream << "Name: " << maxName << "\t pos: " << maxPOS << "\t inn:" << maxINN << "\t year: " << maxYear << '\n';
  280. }
  281.  
  282. // функция для очистки потока ввода
  283. void clearStream(std::istream& stream)
  284. {
  285. stream.ignore(stream.rdbuf()->in_avail(), '\n');
  286. }
  287.  
  288. void main()
  289. {
  290. //const int rows = 1, cols = 2;
  291. //DynamicArray <int, rows, cols> arr;
  292. //arr.setDynamicArray(10, 20, 0);
  293. ////arr.setDynamicArray(20, 30, 0);
  294. //arr.getDynamicArray(10, 20);
  295.  
  296.  
  297.  
  298. setlocale(LC_ALL, "rus");
  299. // библиотека файлов
  300. Card prod;
  301. char name1[MAX_STRING_SIZE] = "Rin A.C.";
  302. char name2[MAX_STRING_SIZE] = "Vil T.U.";
  303. char name3[MAX_STRING_SIZE] = "Olya O.P.";
  304. char position1[MAX_STRING_SIZE] = "Meneger";
  305. char position2[MAX_STRING_SIZE] = "Directory";
  306. char position3[MAX_STRING_SIZE] = "Secretary";
  307. char inn1[MAX_STRING_SIZE] = "7685940302";
  308. char inn2[MAX_STRING_SIZE] = "1234567890";
  309. char inn3[MAX_STRING_SIZE] = "3344556677";
  310. unsigned short year1 = 2013;
  311. unsigned short year2 = 2003;
  312. unsigned short year3 = 2017;
  313. prod.AddNewCard(name1, position1, inn1, year1);
  314. prod.AddNewCard(name2, position2, inn2, year2);
  315. prod.AddNewCard(name3, position3, inn3, year3);
  316. /*программа иллюстрирующая работу с классом Card*/
  317. char tname_1[MAX_STRING_SIZE];
  318. char tname_2[MAX_STRING_SIZE];
  319. char tname_3[MAX_STRING_SIZE];
  320. unsigned short year;
  321. int n;
  322. do
  323. {
  324. std::cout << '\n';
  325. std::cout << "1 - Print all\n";
  326. std::cout << "2 - Find by year\n";
  327. std::cout << "3 - Find max element\n";
  328. std::cout << "4 - Find min element\n";
  329. std::cout << "5 - Add card\n";
  330. std::cout << "6 - Delete All \n";
  331. std::cout << "7 - Sort + Print All\n";
  332. std::cout << "0 - Exit\n";
  333. std::cout << '\n';
  334. std::cin >> n;
  335. switch (n)
  336. {
  337. case 1:
  338. {
  339. prod.PrintAll(std::cout);
  340. break;
  341. }
  342. case 2:
  343. {
  344. std::cout << "Year: ";
  345. clearStream(std::cin); // очистка потока ввода
  346. std::cin>>(year); // ввод названий с пробелами
  347. prod.Find(year);
  348. break;
  349. }
  350. case 3:
  351. {
  352. prod.maxElement(std::cout);
  353. break;
  354. }
  355. case 4:
  356. {
  357. prod.minElement(std::cout);
  358. break;
  359. }
  360. case 5:
  361. {
  362. std::cout << "name: ";
  363. clearStream(std::cin); // очистка потока ввода
  364. std::cin.get(tname_1, MAX_STRING_SIZE); // ввод названий с пробелами
  365.  
  366. std::cout << "Position: ";
  367. clearStream(std::cin); // очистка потока ввода
  368. std::cin.get(tname_2, MAX_STRING_SIZE); // ввод названий с пробелами
  369.  
  370. std::cout << "inn: ";
  371. clearStream(std::cin); // очистка потока ввода
  372. std::cin.get(tname_3, MAX_STRING_SIZE); // ввод названий с пробелами
  373.  
  374. std::cout << "Year: ";
  375. clearStream(std::cin); // очистка потока ввода
  376. std::cin>>year; // ввод названий с пробелами
  377. prod.AddNewCard(tname_1, tname_2, tname_3, year);
  378. break;
  379. }
  380. case 6:
  381. {
  382. prod.DeleteAll();
  383. break;
  384. }
  385. case 7:
  386. {
  387. prod.Sort();
  388. prod.PrintAll(std::cout);
  389. break;
  390. }
  391. }
  392. } while (n!= 0);
  393. prod.DeleteAll();
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement